순차탐색
- 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서 부터 데이터를 하나씩 차례대로 확인하는 방법
- 최적의 시간복잡도 O(1) : 가장 첫번째에 찾고자 하는 데이터가 있는경우
- 최악의 시간복잡도 O(n) : 가장 마지막에 찾고자 하는 데이터가 있는경우
이진탐색
- 찾으려는 데이터와 정렬 된 리스트의 중간지점을 계속해서 재귀적으로 반복하며 비교해서 찾아내는 방법
- 데이터들이 정렬 되어 있어야 한다.
- 탐색하고자 하는 범위의 시작점, 끝점, 중간점의 변수를 사용한다.
34의 인덱스를 찾는다고 해보자
1. low ,middle, high = index : 0, 7, 15 설정, index(middle) < 34 이므로
2. low, middle, high = index : 8, 11, 15 설정, index(middle) > 34 이므로
3. low, middle, high = index : 8, 9, 10 설정, index(middle) < 34 이므로
4. low, middle, high = index : 10, 10, 10 설정, index(middle) = 34 이므로
34의 인덱스는 10이다.
이를 파이썬으로 구현해보자.
li = [2, 6, 11, 13, 18, 20, 22, 27, 29, 30, 34, 38, 41, 42, 45, 47]
def binary_search(arr, var, low, high):
middle = int((low + high) / 2)
if var == arr[middle]:
return middle
elif var < arr[middle]:
# 재귀함수는 맨끝에 있는 것을 반환해야 맨 앞의 재귀함수까지 반환된다.
return binary_search(arr, var, low, middle - 1)
elif var > arr[middle]:
return binary_search(arr, var, middle + 1, high)
else:
print("Cant search value")
print(binary_search(li, 22, 0, len(li) - 1))
위와 같이 재귀함수로 구현이 가능하다. 반복문으로도 구현이가능하다.
li = [2, 6, 11, 13, 18, 20, 22, 27, 29, 30, 34, 38, 41, 42, 45, 47]
def binary_search(arr, var):
low = 0
high = len(arr) - 1
while low <= high:
middle = int((low + high)/2)
if var == arr[middle]:
return middle
elif var > arr[middle]:
low = middle + 1
elif var < arr[middle]:
high = middle - 1
else:
return "Cant search value"
print(binary_search(li, 22))
- 최적의 시간복잡도 O(1) : 가장 첫번째에 찾고자 하는 데이터가 있는경우
- 최악의 시간복잡도 O(log n)
이와같이 이진탐색은 매번 배열을 반으로 줄인다. 따라서 시간복잡도가 log n 이 최대이다.
'ComputerScience > 자료구조' 카테고리의 다른 글
자료구조 - HEAP [완전이진트리, 힙, 우선순위 큐] (0) | 2020.11.04 |
---|---|
자료구조 - 트리[이진탐색트리] (0) | 2020.09.21 |
자료구조 - 정렬 [선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬] (0) | 2020.09.04 |
자료구조 - 탐색알고리즘 BFS (0) | 2020.08.25 |
자료구조 - 탐색알고리즘 DFS (0) | 2020.08.19 |