이진탐색
- 자료의 가운데에 있는 항목의 키 값과 비교하여 다음 검색의 위치를 결정하고 검색을 계속 진행하는 방법
- 목적 키를 찾을 때까지 이진 검색을 순환적으로 반복 수행함으로써 검색범위를 반으로 줄여가면서 보다 빠르게 검색을 수행함
- 이진 검색을 하기 위해서는 자료가 정렬된 상태여야함.
- 검색 과정
- 자료의 중앙에 있는 원소를 고른다.
- 중앙 원소의 값과 찾고자하는 목표값을 비교한다.
- 목표값이 중앙 원소의 값보다 작으면 자료의 왼쪽 반에 대해서 새로 검색을 수행하고, 크다면 자료의 오른쪽 반에 대해서 새로 검색을 수행한다.
def binary_search(lst,target) :
length = len(lst)
start = 0
end = lenght-1
while start<=end :
middle = (start+end)//2
if target == lst[middle] :
return cnt
elif lst[middle] > target :
end = middle-1
else :
start = middle+1
return False
- 시작점과 끝점을 지정한다.
- 시작점이 끝점보다 작거나 같으면
- 중앙은 (시작점+끝점)을 2로 나눈 몫
- 찾으려는 값과 일치하면
- 끝냄
- 일치하지 않고 중앙값이 찾으려는 값보다 크면
- 끝점을 middle-1
- 중앙값이 찾으려는 값보다 작으면
- 시작점을 middle+1로
def binarySearch2(a,low,high,key) :
if low>high :
return False
else :
middle = (low+high)//2
if key == a[middle] :
return True
elif key < a[middle] :
return binarySearch2(a,low,middle-1,key)
elif a[middle]<key :
return binarySearch2(a,middle+1,high,key)
실제 문제에 적용
target = 25
m_list = [30, 94, 27, 92, 21, 37, 25, 47, 25, 53, 98, 19, 32, 32, 7]
length = len(m_list)
m_list.sort()
left = 0
right = length-1
while left<=right:
mid = (left+right)//2
if m_list[mid] == target:
print(mid+1)
break
elif m_list[mid]>target:
right = mid-1
else :
left = mid+1
def binary_search(target) :
start = 1
end = Page
cnt = 1
while start<=end :
middle = (start+end)//2
if target == middle :
return cnt
elif middle > target :
end = middle
else :
start = middle
cnt +=1
return False