이진탐색

2021. 5. 14. 22:29Algorithm/Concept

반응형

이진탐색

 

이진탐색이란 반으로 쪼개가면서 탐색하는 것이다.

 

 

 

이진탐색은 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있고,

단, 배열 내부의 데이터가 정렬되어 있어야하며

위치를 나타내는 변수 3개를 사용하는데 "시작점, 끝점, 중간점"을 사용한다.

 

 

핵심은 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는 것이다.

 

 

이진탐색은 한번 확인할 때마다 원소의 개수가 절반씩 줄어든다는 점에서 시간복잡도가 O(logN)이다. 

 

 

이진탐색을 구현하는 방법에는 두가지가 있다.

1. 재귀함수

2. 반복문

 

# 재귀함수 코드

def binary_search(array,target,start,end):
    if start > end :
        return None
    mid = (start+end)//2
    # 찾은 경우 인덱스 반환
    if array[mid]==target:
        return mid
    # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
    elif array[mid]>target:
        return binary_search(array,target,start,mid-1)
    # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
    else:
        return binary_search(array,target,mid+1,end)

n, target = list(map(int,input().split()))
array = list(map(int,input().split()))

result = binary_search(array,target,0,n-1)

if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result+1)

 

 

# 반복문 코드 

# 반복문
def binary_search_loop(array,target,start,end):
    while start <=end:
        mid = (start+end)//2
        if array[mid]==target:
            return mid
        elif array[mid]>target:
            end = mid-1
        else:
            start = mid +1
    return None

n, target = list(map(int,input().split()))
array = list(map(int,input().split()))

result = binary_search_loop(array,target,0,n-1)

if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result+1)

 

 

 

이진탐색트리

 

더불어 이진탐색트리에 대해 설명하고자 한다.

 

이진 탐색 트리란 이진 탐색이 동작할 수 있도록 고안된, 효율적인 탐색이 가능한 자료구조이다. 

 

특징

1. 부모 노드보다 왼쪽 자식 노드가 작다.

2. 부모 노드보다 오른쪽 자식 노드가 크다.

즉, 왼쪽 자식 노드 < 부모 노드 < 오른쪽 자식 노드 

 

 

 

 

 

알아두면 좋은 것

이진 탐색문제는 입력 데이터가 많거나, 탐색 범위가 매우 넓은 편이다. 

예를 들어 데이터의 개수가 1000만 개를 넘어가거나 탐색 범위의 크기가 100억 이상이라면 이진탐색 알고리즘을 의심해보자. 

이런 경우 input() 함수로 입력을 받는다면 시간초과를 받을 수 있으므로,

sys라이브러리의 readline()함수를 이용하자. 

 

import sys
data = sys.stdin.readline().rstrip()

 

여기서 rstrip()함수를 꼭 호출해야 한다. 

readline()을 입력하면 입력후 엔터가 줄바꿈기호로 입력되는데 , 이 공백 문자를 제거하려면 rstrip()을 사용하여야한다. 

 

 

 

 

 

 

[참고자료]

이것이 취업을 위한 코딩테스트다 - 저자 나동빈 

반응형

'Algorithm > Concept' 카테고리의 다른 글

DFS와 BFS  (0) 2021.03.10