이진 검색

입력 : 이미 정렬 된 배열이 array_to_search를 검색 할, 당신은 왼쪽에서 오른쪽으로, 국경을 찾아, 숫자의 번호를 찾을 필요가있다.

출력 : array_to_search에 위치 개수 -1 출력 찾으면 없음.

아이디어의 실현

  1. 어레이 array_to_search [중앙]의 중간 요소가 검색 수가 동일한 경우, 단부를 찾는데 성공한 것으로 숫자와 비교된다;
  2. array_to_search [중간]> 수가 수가 포기 절반 크기를 찾기 위해 상기 array_to_search 전반 발생 후반 찾게 가능성 만이면 1 단계로 복귀;
  3. array_to_search [중앙]는 <수가 수가 포기 절반으로 크기를 찾기 위해 상기 array_to_search의 후반부에서 발생 전반 찾게 가능성 만이면 1 단계로 복귀;
  4. 그것은 1 = 아직 발견되지 수의 규모를 찾을 수있는 경우에는 숫자, 끝은없는 배열을 찾을 수 있습니다.

두 가지 예

성공을 찾기

输入: array_to_search = [ 1, 7, 12, 16, 24, 28, 34, 39 , 번호 = 34 = 7 오른쪽, 왼쪽 = 0

  1. 중간 = (0 + 7) = 3 // 2, array_to_search [중간] = (16)는, 다음과 같은 상태가된다 array_to_search 수보다 :

    [1, 7, 12, 16, 24, 28, 34, 39 ]
  2. 중간 = (4 + 7) // 2 = 5 array_to_search [중간] = (28)는, 다음과 같은 상태가된다 array_to_search 수보다 :

    [1, 7, 12, 16, 24, 28, 34, 39 ]
  3. 숫자, 알고리즘이 종료 동일 중간 = (6 + 7) // 2 = 6 array_to_search [중간] = 34

실패 찾기

输入: array_to_search = [ 1, 7, 12, 16, 24, 28, 34, 39 , 번호 = 3 = 7, 오른쪽 = 0 왼쪽

  1. 중간 = (0 + 7) = 3 // 2, array_to_search [중간은 다음과 같이 상태가된다 array_to_search, 16보다 큰 수 =

    [ 1, 7, 12 , 16, 24, 28, 34, 39]
  2. 다음과 같은 수보다 많은 중간 = (0 + 2) // 2 = 1 array_to_search [중간] = 7, array_to_search 상태가된다 :

    [ 1 , 7, 12, 16, 24, 28, 34, 39]
  3. 중간 = (0 + 0) // = 0 (2), array_to_search [중간] = 1, 의한 문제의 스케일의 수보다 적은 것은 이미 1, 알고리즘을 종료한다 룩업 실패.

플로우 차트

null28eb9fd83308f5c1.jpg

전체 알고리즘 (파이썬 구현)

from random import uniform

def binary_search(array_to_search, number, left, right):
    index = -1
    while(left <= right):
        middle = (left + right) // 2
        if array_to_search[middle] == number:
            index = middle
            break
        elif array_to_search[middle] > number:
            right = middle - 1
        else:
            left = middle + 1
    return index

if __name__ == '__main__':
    array_size = int(input("Please input the length of array:"))
    array_to_search = [int(uniform(0, 5)) + 5 * i for i in range (0, array_size)]
    print("Init array:", array_to_search)
    number = int(input("Please input the number you want to search:"))
    
    # start search
    print("\n\n")
    print("######################")
    print("## Start searching! ##")
    print("######################")
    print("")
    
    print("Binary Search:", binary_search(array_to_search, number, 0, len(array_to_search)))

시간 복잡도

길이 N의 배열, 및 각 시각에 대한 원래의 중간 부재의 축척과 비교 \ (\ FRAC. 1} {2} {\) 이므로 후 \ (\ log_2n \) 의 비교 후, 크기 1로 감소되므로 이진 탐색 시간의 복잡성은한다 \ (O (\ log_2n) \) .

추천

출처www.cnblogs.com/angiebare/p/11616796.html