PROGRAMMING/ALGORITHM
검색 알고리즘-이진검색(Binary Search)
KSN
2022. 12. 2. 18:16
이진 검색(Binary search)
이진 검색은 일정한 규칙으로 늘어놓은 데이터 집합에서 아주 빠른 검색을 수행한다.
이진 검색 알고리즘을 사용하려면 배열의 데이터가 정렬되어 있어야 하고 이진 검색은 선형 검색보다 빠르게 검색할 수 있다는 장점이 있다.
*이진 검색은 원소가 오름차순이나 내림차순으로 정렬된 배열에서 좀 더 효율적으로 검색할 수 있는 알고리즘이다.
이진 검색의 검색 범위의 맨 앞, 맨 끝, 중앙의 인덱스를 각각 pl,pr,pc라고 하고 중앙 값부터 검색 범위를 계속 좁혀가면 된다.
# binary search 이진검색 알고리즘
from typing import Any,Sequence
def bin_search(a:Sequence, key:Any) -> int:
"""sequence a에서 key와 일치하는 원소를 이진검색"""
pl = 0 #검색 범위 맨 앞 원소의 인덱스
pr = len(a) - 1 # 검색 범위 맨 끝 원소의 인덱스
while True:
pc = (pl+pr) //2 #중앙 원소의 인덱스
if a[pc] == key:
return pc
elif a[pc] < key:
pl = pc+1 #검색 범위를 뒤쪽 절반으로 좁힘
else:
pr = pc-1 # 검색범위를 앞쪽 절반으로 좁힘
if pl>pr:
break
return -1 # fail search
if __name__=='__main__':
num=int(input('원소수를 입력하세요: '))
x = [None] * num
print('배열 데이터를 오름차순으로 입력')
x[0] = int(input('x[0]: '))
for i in range(1,num):
while True:
x[i] = int(input(f'x[{i}]: '))
if x[i] >= x[i-1]: #바로 직전에 입력한 원솟값보다 큰 값을 입력
break
ky=int(input('put the value: '))
idx = bin_search(x,ky)
if idx==-1:
print('검색값을 갖는 원소가 존재하지 않습니다.')
else:
print(f'검색값은 x[{idx}]에 있습니다.')