Machineboy空

코테대비 01. 이진 탐색 (Binary Search) 본문

Computer/알고리즘

코테대비 01. 이진 탐색 (Binary Search)

안녕도라 2025. 3. 12. 17:15

원리

배열 A가 정렬되어 있다고 할 때,

  • A の真ん中の要素が k 未満であれば、A の前半分の要素もすべて k 未満であることがわかります。つまり、A の前半分について探索する必要が無くなります

A의 중앙값보다 비교할 요소가 작다면, 나머지 오른쪽 절반의 요소들 보다 작다.

  • 逆に、A の真ん中の要素が k より大きければ、A の後ろ半分の要素もすべて k より大きいので、A の後ろ半分について探索する必要が無くなります。

A의 중앙값보다 비교할 요소가 크다면, 나머지 왼쪽 절반의 요소들 보다 크다.

  • つまり、「対象とする探索範囲の中央の値」と「探索したい値」を比較することで、探索範囲を半分にすることができます。

즉, 탐색 범위의 중앙 값과 탐색하고 싶은 값을 비교하며 탐색 범위를 절반으로 줄일 수 있다!


Tip

  • ソート済みであること

정렬되어 있어야 한다.

  • 二分探索をおこなう際は、区間をどのような形で持つか (開・閉・半開) を問題に合わせて適切に選択する必要があります。

문제에 따라 비교 범위의 개구간 폐구간을 신경써야 한다.


Sudo 코드

/**
ソート済みの数列 A に 値 k が含まれているなら true を、含まれていないなら no を返す
*/
binary_search(A : 数列, n : 数列のサイズ, k : 探索する値)
    // 探索範囲 [left, right]
    left = 0
    right = n-1
    
    // 探索範囲を狭めていく
    while left <= right

        // 探索範囲の中央
        mid = (left + right) / 2

        if A[mid] == k then
            return true
        else if A[mid] < k then
            left = mid+1
        else 
            right = mid-1
    
    return false
static bool BinarySearch(List<int> sortedList, int target)
    {
        int low = 0;
        int high = sortedList.Count - 1;

        while (low <= high)
        {
            int mid = (low + high) / 2;

            if (sortedList[mid] == target)
                return true;
            else if (sortedList[mid] > target)
                high = mid - 1;
            else
                low = mid + 1;
        }

        return false;
    }

시간 복잡도

O(log N)


예제

https://paiza.jp/works/mondai/binary_search/binary_search__basic_step0/edit?language_uid=c-sharp&t=13e37cdf77b52361e66b52b7de9a0fbb

 

ログイン

ログイン画面です。|ITエンジニア・プログラマ向け総合求職・学習サイト【paiza】

paiza.jp

 

https://machineboy0.tistory.com/323

 

Excercism - Binary Search : 이진탐색, 이진탐색 트리

문제요약이진탐색을 통해 찾는 숫자를 찾아 인덱스를 반환하라.없다면 -1을 반환하라. https://exercism.org/tracks/csharp/exercises/binary-search/iterations ExercismLearn, practice and get world-class mentoring in over 50 lang

machineboy0.tistory.com

 

'Computer > 알고리즘' 카테고리의 다른 글

위상정렬(Topological Sort)  (0) 2025.03.20
분할정복(Divide and Conquer)과 백트래킹  (0) 2024.07.10
문자열 빈출 문제들  (1) 2024.07.10
시간복잡도  (0) 2024.07.08
애드혹(ad-hoc) 알고리즘  (0) 2024.07.02