일반적으로 탐색은
위와 같은 상황처럼 주어진 자료구조에서 원하는 항목을 찾기 위해 사용된다. 탐색하려는 대상 자료구조에 따라 다음과 같이 나눌 수 있다.
시간 복잡도는 O(n)으로, 리스트나 배열의 길이에 비례해 탐색 시간이 증가한다.
가장 간단한 방법으로 데이터가 정렬되어 있지 않거나 크기가 작은 경우에 사용할 수 있으며 데이터의 크기가 크거나 효율성이 중요한 경우에는 성능이 떨어진다.
def binarySearch(search_list, search, left=0, right=None):
# 각각 왼쪽, 오른쪽 끝 인덱스를 나타내는 left, right
if right is None: # right 초기 설정
right = len(search_list) - 1
while left <= right:
now = (left + right) // 2 # 중간 인덱스 now
if search_list[now] < search: # now 기준 오른쪽 부분 탐색
left = now + 1
elif search_list[now] > search: # now 기준 왼쪽 부분 탐색
right = now - 1
else:
return now
return -1 # 찾으려는 값이 리스트에 없으면 -1 리턴
이진 탐색의 시간 복잡도는 O(log n)으로 탐색하고자 하는 데이터가 정렬되어 있고 대용량 데이터의 경우 효율적인 탐색 알고리즘이다. 하지만 정렬된 데이터에 새로운 데이터의 삽입/삭제가 필요한 경우 O(n)의 시간 복잡도를 갖기 때문에 데이터의 삽입/삭제가 빈번한 경우에는 경우 불리하다.