더북(TheBook)

가운데 인덱스 mid의 데이터 5와 target 데이터 8을 비교했을 때 8이 5보다 크므로 startmid + 1이 됩니다. 이때 5와 5 이전 데이터 1~4는 더 이상 비교할 필요가 없습니다. 이를 코드로 표현하면 코드 15-2와 같습니다.

코드 15-2 algorithm/algo_1/binary_search.py

def binary_search(data, target):
    # 리스트를 정렬 상태로 만든다
    data.sort()
    # start는 시작 인덱스, end는 마지막 인덱스
    start = 0
    end = len(data) - 1

    # start와 end가 교차하기 전까지 반복
    while start <= end:
        # mid는 start와 end의 가운데 인덱스
        mid = (start + end) // 2

        # target 데이터가 mid의 데이터와 같다면
        # mid를 반환
        if data[mid] = = target:
            return mid
        # target 데이터가 작다면
        # end를 mid - 1로 지정
        elif data[mid] > target:
            end = mid - 1
        # target 데이터가 크다면
        # start를 mid + 1로 지정
        else:
            start = mid + 1
    # start와 end가 교차했을 때까지
    # target을 찾지 못했다면
    # target이 리스트에 존재하지 않는다
    return None

if __name__ = = "__main__":
    data = [i**2 for i in range(1, 11)]

    target = 9
    idx = binary_search(data, target)

    if idx = = None:
        print("{}이 존재하지 않습니다".format(target))
    else:
        print("찾는 데이터의 인덱스는 {}이고 데이터는 {}입니다.".format(idx, data[idx]))

실행결과 찾는 데이터의 인덱스는 2이고 데이터는 9입니다.


설명은 주석으로 대신하겠습니다. 그림 15-2와 비교하면서 보면 어렵지 않게 이해할 수 있을 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.