ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 검색 알고리즘 - 이진검색
    Algorithm 2022. 1. 20. 18:51

    검색의 종류로는 배열 검색, 연결 리스트 검색, 이진 검색 트리 알고리즘이 있다.

    배열 검색의 종류로는 

     

    • 선형 검색 : 무작위로 늘어놓은 데이터 집합에서 검색을 수행한다.
    • 이진 검색 : 일정한 규칙으로 늘어놓은 데이터 집합에서 빠른 검색을 수행한다.
    • 해시법 : 추가-삭제가 자주 일어나는 데이터 집합에서 빠른 검색을 수행한다. 
      • 체인법 : 같은 해시값 데이터를 연결 리스트로 연결하는 방법이다.
      • 오픈 주소법 : 데이터를 위한 해시값이 충돌할 때 재해시하는 방법이다.

    이진 검색 binary search

     

    이진 검색은 원소가 오름차순이나 내림차순으로 정렬(sort)된 배열에 좀 더 효율적으로 검색할 수 있는 알고리즘이다. (선형 검색보다 빠르게 검색 가능)

     

     

    위의 그림처럼 오름차순으로 정렬된 배열에서 76을 찾는 과정이다. 이진 검색에서는 배열의 중앙에 위치한 a[7]인 47에 주목한다. 76은 47보다 뒤에 위치한다. 그러면 검색 대상을 a[8] ~ a[14]로 좁힌다. 그다음 중앙값인 a[11]=77과 76을 비교하면 검색 대상을 a[8]~a[10]으로 좁힐 수 있다. 이제 검색해야 하는 대상은 2개고 76의 위치를 찾을 수 있다.

     

    검색 범위의 맨 앞(pl), 맨 끝(pr), 중앙(pc)의 인덱스를 각각 0, n-1, (n-1)//2로 초기화한다.

     

    <code>

    더보기
    # -- 이진 검색 알고리즘
    
    from typing import Any, Sequence
    
    def bin_search(a: Sequence, key: Any):
        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
    
    
    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('검색할 값을 입력하세요 : '))
        idx = bin_search(x, ky)
        
        if idx == -1:
            print('검색값을 갖는 원소가 존재하지 않습니다.')
        else:
            print(f'검색값은 x[{idx}]에 있습니다.')

     

     

    이진 검색 알고리즘은 반복할 때마다 검색 범위가 거의 절반으로 줄어들기 때문에 필요한 비교 횟수는 평균 log n이다. 검색에 실패할 경우는 [log(n+1)]번이며, 검색에 성공할 경우는 logn - 1번이다.

     

     

     

    'Algorithm' 카테고리의 다른 글

    큐와 스택  (0) 2022.01.27
    검색 알고리즘 - 해시법  (0) 2022.01.20
    검색 알고리즘 - 선형 검색  (0) 2022.01.20
    병합 정렬, 힙 정렬 (파이썬)  (0) 2021.06.22
    복잡도  (0) 2021.03.27
Designed by Tistory.