バイナリナビゲーション


バイナリナビゲーション

  • 資料センター項目のキー値と比較して、次の検索の場所を特定して検索を継続する方法
  • 目的キーが見つかるまでループでバイナリ検索を行い、検索範囲を半分に絞り込みながら検索をより速く行う
  • バイナリ検索を行うためには、資料を並べ替えなければならない.
  • 検索手順
  • 資料中央の要素を選択する.
  • 中央要素の値と探している目標値を比較します.
  • ターゲット値が中央要素の値より小さい場合は、資料の左半分に対して新規検索を実行し、大きい場合は、資料の右半分に対して新規検索を実行する.

  • def binary_search(lst,target) :
        length = len(lst)
        start = 0
        end = lenght-1 #끝 쪽수
        while start<=end : #찾으려는 부분 처음이 끝보다 작거나 같으면
            middle = (start+end)//2 #middle start+end를 2로 나눈 값의 몫
            if target == lst[middle] : #target과 middle이 같으면
                return cnt #반복 횟수 반환
            elif lst[middle] > target : #middle이 찾으려는 target보다 크면
                end = middle-1 #마지막 부분 -1을 middle로 갱신
            else : #middle이 찾으려는 target보다 작으면
                 start = middle+1 #처음 부분 +1을 middle로 갱신
        return False
  • 始点と終点を指定
  • 始点が終点以下
  • 中央は(起点+終点)を2で割ったシェア
  • 探す値と一致する場合
  • 終了
  • 一致しない中央値が検索する値より大きい場合
  • 中点-1
  • 中心値が検索する値より小さい場合
  • 起点は中間+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 #middle start+end를 2로 나눈 값의 몫
            if target == middle : #target과 middle이 같으면
                return cnt #반복 횟수 반환
            elif middle > target : #middle이 찾으려는 target보다 크면
                end = middle #마지막 부분을 middle로 갱신
            else : #middle이 찾으려는 target보다 작으면
                 start = middle #처음 부분을 middle로 갱신
            cnt +=1
        return False