Data

[알고리즘] 이분 탐색 / 이진 탐색 (binary search)

생각하는 감쟈🥔 2023. 11. 22. 13:45

이분 탐색

- 오름차순으로 정렬된 배열을 반복적으로 반으로 나누어 target이 선택될 떄 까지 탐색하는 알고리즘

- 조건 : 반드시 오름차순으로 정렬된 상태에서 시작해야 한다

 

Olog(N)

반복문과 재귀 두 가지 방법을 사용할 수 있다

 

target : 찾고자 하는 값

data : 오름차순으로 정렬된 list

start : data의 처음값 인덱스

end : data의 마지막 값 인덱스

mid : start, end 의 중간 인덱스

 

자료의 중갑 값(Mid) 차고자 하는 값인지 겁사

아니라며면 대소 관계를 비교하는 start, end 값 이동

동일 연산 반복 (재귀로 구현 가능)

 

자료의 중간 값이 찾고자 하는 값인지 비교

 mid값이 target과 다트라면 대소관계를 비교하여 탐색 범위를 좁히고, tqrget과 mid 값이 같을 때 까지 반복

1) target이 mid 값 보다 작으면 end를 mid 왼쪽 값으로 바꿔준다( 절반의 왼쪽)

2) target이 mid 값 보다 크면 start를 mid 오른쪽 값으로 바꿔준다( 절반의 오른쪽 탐색)

 

서치

def binary_search(target, data):
    data.sort()
    start = 0
    end = len(data) - 1

    while start <= end:
        mid = (start + end) // 2

        if data[mid] == target:
            return mid
        elif data[mid] < target:
            start = mid + 1
        else:
            end = mid -1

    return None

 

 

 

이중 이분 탐색

- 같은 중복 데이터가 있을때 : 중복되는 데이터 개수 확인 가능

- low/upper 방식을 이중으로 사용

 

low 방식 : 제일 앞에 있는 부분에 위치에 있는 데이터 탐색

upper 방식 : 제일 마지막에 있는 데이터 확인 가능