탐색 알고리즘(Search)
1. 순차 탐색 (Sequential Search)
•
탐색은 여러 데이터 중에서 원하는 데이터를 찾아내는 것을 의미
•
데이터가 담겨있는 리스트를 앞에서부터 하나씩 비교해서 원하는 데이터를 찾는 방법
2. 이진 탐색 (Binary Search)
•
탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법
2.1. 분할 정복 알고리즘과 이진 탐색
•
분할 정복 알고리즘 (Divide and Conquer)
◦
Divide: 문제를 하나 또는 둘 이상으로 나눈다.
◦
Conquer: 나눠진 문제가 충분히 작고, 해결이 가능하다면 해결하고, 그렇지 않다면 다시 나눈다.
•
이진 탐색
◦
Divide: 리스트를 두 개의 서브 리스트로 나눈다.
◦
Comquer
▪
검색할 숫자 (search) > 중간값 이면, 뒷 부분의 서브 리스트에서 검색할 숫자를 찾는다.
▪
검색할 숫자 (search) < 중간값 이면, 앞 부분의 서브 리스트에서 검색할 숫자를 찾는다.
2.2 알고리즘 구현
•
이진 탐색은 데이터가 정렬되있는 상태에서 진행
•
데이터가 [2, 3, 8, 12, 20] 일 때,
◦
binary_search(data_list, find_data) 함수를 만들고
▪
find_data는 찾는 숫자
▪
data_list는 데이터 리스트
▪
data_list의 중간값을 find_data와 비교해서
•
find_data < data_list의 중간값 이라면
◦
맨 앞부터 data_list의 중간까지 에서 다시 find_data 찾기
•
data_list의 중간값 < find_data 이라면
◦
data_list의 중간부터 맨 끝까지에서 다시 find_data 찾기
•
그렇지 않다면, data_list의 중간값은 find_data 인 경우로, return data_list 중간위치
2.3. 알고리즘 분석
•
n개의 리스트를 매번 2로 나누어 1이 될 때까지 비교연산을 k회 진행
◦
<font size=4em>n X $\frac { 1 }{ 2 }$ X $\frac { 1 }{ 2 }$ X $\frac { 1 }{ 2 }$ ... = 1</font>
◦
<font size=4em>n X $\frac { 1 }{ 2 }^k$ = 1</font>
◦
<font size=4em>n = $2^k$ = $log_2 n$ = $log_2 2^k$</font>
◦
<font size=4em>$log_2 n$ = k</font>
◦
빅 오 표기법으로는 k + 1 이 결국 최종 시간 복잡도임 (1이 되었을 때도, 비교연산을 한번 수행)
▪
결국 O($log_2 n$ + 1) 이고, 2와 1, 상수는 삭제 되므로, O($log n$)
2.4. 구현
def binary_search(data, search):
print (data)
if len(data) == 1 and search == data[0]:
return True
if len(data) == 1 and search != data[0]:
return False
if len(data) == 0:
return False
medium = len(data) // 2
if search == data[medium]:
return True
else:
if search > data[medium]:
return binary_search(data[medium+1:], search)
else:
return binary_search(data[:medium], search)
Plain Text
복사