본문 바로가기
코딩/알고리즘

[검색] 이진검색 알고리즘

by 미생22 2023. 1. 20.
728x90

1. 이진검색

정렬되어 있는 자료구조에서 중앙값과의 크고 작음을 이용해서 데이터를 검색한다.

(이진검색에서 주의할 점은 데이터가 꼭 정렬되어있어야 한다.)

 

[0] [1] [2] [3] [4] [5] [6] [7] [8]

 1   2   3   4   5   6   7   8   9

 

중앙값이 [4]므로 검색대상과 '5'를 비교한다.

검색대상이 '2'인 경우, 2<5 므로

 

[0] [1] [2] [3] [4]

 1   2   3   4   5

 

다시 중앙값이 [2] 3이므로 검색대상과 '3'을 비교한다. 이렇게 검색범위를 좁혀나가는 것.

2<3이므로 

 

[0] [1] [2]

 1   2   3

 

중앙값이 [1] 2이고 검색대상이 2므로

2=2로 원하는 대상 [1] 2를 찾을 수 있다.

 

따라서 초기화하는 변수는 startIdx, endIdx, midIdx, midVal가 되겠다.

 

그리고 if~elif~문으로 searchData가 midVal보다 큰 경우, 작은 경우, 같은 경우를 나눠준다.

코드는 아래와 같다.

 

# 정렬되어있는 자료구조
datas = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
print(f'datas : {datas}')
print(f'datas length : {len(datas)}')

searchData = int(input('찾으려는 숫자 입력 : '))
searchResultIdx = -1

startIdx = 0
endIdx = len(datas) - 1
midIdx = (startIdx + endIdx) // 2
midVal = datas[midIdx]

#while searchData in datas지만 알고리즘에선 in을 쓸 수 없다. 고로 수식으로 나타내야함. 정렬되어있으므로 크다 작다로 datas에 들어있음을 확인가능
while searchData <= datas[len(datas)-1] and searchData >= datas[0]:
    # 끝에있는 숫자는 //2에 의해서 절대 midVal가 될 수 없으므로 따로 if문으로 빼내줘야한다
    if searchData == datas[len(datas)-1]:
        searchResultIdx = len(datas)-1
        break
    if searchData > midVal:
        startIdx = midIdx
        #endIdx는 그대로
    elif searchData < midVal:
        endIdx = midIdx
        #startIdx는 그대로
    elif searchData == midVal:
        searchResultIdx = midIdx
        break


    midIdx = (startIdx + endIdx) // 2
    midVal = datas[midIdx]
    
print(f'searchResultIdx : {searchResultIdx}')

 

728x90

'코딩 > 알고리즘' 카테고리의 다른 글

[정렬] 선택정렬 알고리즘  (0) 2023.01.31
[정렬] 삽입정렬 알고리즘  (0) 2023.01.31
[정렬] 버블정렬 알고리즘  (0) 2023.01.27
[순위] 순위 알고리즘  (0) 2023.01.26
[검색] 선형검색 알고리즘  (0) 2023.01.19