알고리즘 자료구조

이진탐색 파이썬

Zeta050525 2021. 12. 8. 03:30
728x90

선형 탐색

[1,2,3,4,5,6,7,8,9,10]

이런 배열에서 5를 선형 탐색으로 찾는다면

[0] = 1 아님

[1] = 2 아니고

[2] = 3 아니고 

[3] = 4 아니네

[4] = 5 맞네

이런 식으로 하나하나 다 찾아야 합니다.

 

근데 만약에 1부터 1000까지 들어있는 배열이 있는데

거기서 448을 찾고 싶다면?

정렬되어있다고 가정하에 448번 검사해야 합니다.

진짜 최악의 경우 없거나 index 999에 있다면

1000번 검사해야 하는 꼴이죠

이진 탐색

이진 탐색은 일단 정렬이 되어있어야지 사용할 수 있습니다.

[1,2,3,4,5,6,7,8,9,10]

이런 배열에서 2를 찾고자 한다면

4에 도착합니다. 근데 지금 찾고자 하는 게 2인데

4가 이보다 크죠 그러니까 자길 포함한 뒤에 애들은 싹 다 버립니다

(배열을 삭제하는 게 아니라 취급을 안 한다는 겁니다)

그럼

[1,2,3,]만 남죠

여기서 또 반절인 2에 도착하게 되는데 찾고자 하는 2를 찾았네요

헐 아까는 하나하나 검사해서 5번 만에 찾았는데 이젠 두 번 만에 찾아버렸네요 대박

 

 

 

 

Python으로 구현

재귀 함수로 구현해보면

def binary_search(arr,n,start,end):
    count = 1
    if start > end: 
        return None
    mid = (start+end)//2 #인덱스의 반절을 미드값으로 잡아야해서 2로나눕니다
    if arr[mid] == n: #만약에 잡은 미드값이 찾고자 하는 값이라면
        return mid #index를 리턴해줍니다
    elif arr[mid] > n: #미드값이 찾고자하는 원소보다 크다면
        return binary_search(arr,n,start,mid - 1) #뒤에 원소들은 버립니다
    else: #미드값이 찾고자하는 값보다 작다면 
        return binary_search(arr,n,mid + 1, end) #시작점을 미드값으로 잡아서 앞에 원소들을 버립니다

 

반복문으로 구현

def repeat_binary(arr,n):
    start = 0
    end = len(arr) - 1
    while start <= end:
        mid = (start+end)//2
        if arr[mid] == n:
            return mid
        elif arr[mid] > n:
            end = mid - 1
        else:
            start = mid + 1

 

이진 탐색 같은 경우는 실제로 사전에서 단어를 찾는다던가 할 때

비슷한 맥락으로 찾아볼 수 있다는 점에서 재밌는 거 같습니다

728x90