二分探索を理解する

    このチュートリアルでは、バイナリ検索の並べ替えがどのように機能するかを学習します。さらに、C言語の例があります。
    二分探索は、ソートされた配列内の要素の位置を見つけるために使用される検索アルゴリズムです。
    この方法では、常に部分配列の中央にある要素を検索します。
    バイナリ検索は、ソートされたリストにのみ実装できます。要素がまだソートされていない場合は、最初にそれらをソートする必要があります。

二分探索はどのように機能しますか?

    二分探索アルゴリズムは、次の2つの方法で実装できます。

  1. 反復法
  2. 再帰

    再帰的方法は、分割統治法に従います。
    これら2つの方法の手順を以下で説明します。

  1. 検索する配列は次のとおりです
    ここに画像の説明を挿入
    。x= 4が検索する要素であるとします。
  2. 2つのポインタをそれぞれ最低位置と最高位置に低く設定します。
    ここに画像の説明を挿入
  3. 配列の中央の要素を見つけます。たとえば、arr [(low + high)/ 2] = 6です。
    ここに画像の説明を挿入
  4. x == midの場合はmidを返し、そうでない場合は検索された要素をmidと比較します。
  5. x> midの場合、xをmidの右側にある要素の中央の要素と比較します。これは、lowをlow = mid +1に設定することで実行できます。
  6. それ以外の場合は、xをmidの左側にある中央の要素と比較します。これは、highをhigh = mid-1に設定することで実行できます。
    ここに画像の説明を挿入
  7. 低値が高値に達するまで、手順3〜6を繰り返します。
    ここに画像の説明を挿入
  8. x = 4を見つけます。
二分探索擬似コード

    反復法

do until the pointers low and high meet each other.
    mid = (low + high)/2
    if (x == arr[mid])
        return mid
    else if (x > arr[mid]) // x is on the right side
        low = mid + 1
    else                       // x is on the left side
        high = mid - 1

    再帰

binarySearch(arr, x, low, high)
    if low > high
        return False 
    else
        mid = (low + high) / 2 
        if x == arr[mid]
            return mid
        else if x < arr[mid]        // x is on the right side
            return binarySearch(arr, x, mid + 1, high)
        else                               // x is on the right side
            return binarySearch(arr, x, low, mid - 1)
Cの例

    反復法

// Binary Search in C

#include <stdio.h>

int binarySearch(int array[], int x, int low, int high) {
    
    
  // Repeat until the pointers low and high meet each other
  while (low <= high) {
    
    
    int mid = low + (high - low) / 2;

    if (array[mid] == x)
      return mid;

    if (array[mid] < x)
      low = mid + 1;

    else
      high = mid - 1;
  }

  return -1;
}

int main(void) {
    
    
  int array[] = {
    
    3, 4, 5, 6, 7, 8, 9};
  int n = sizeof(array) / sizeof(array[0]);
  int x = 4;
  int result = binarySearch(array, x, 0, n - 1);
  if (result == -1)
    printf("Not found");
  else
    printf("Element is found at index %d", result);
  return 0;
}

    再帰

// Binary Search in C

#include <stdio.h>

int binarySearch(int array[], int x, int low, int high) {
    
    
  if (high >= low) {
    
    
    int mid = low + (high - low) / 2;

    // If found at mid, then return it
    if (array[mid] == x)
      return mid;

    // Search the left half
    if (array[mid] > x)
      return binarySearch(array, x, low, mid - 1);

    // Search the right half
    return binarySearch(array, x, mid + 1, high);
  }

  return -1;
}

int main(void) {
    
    
  int array[] = {
    
    3, 4, 5, 6, 7, 8, 9};
  int n = sizeof(array) / sizeof(array[0]);
  int x = 4;
  int result = binarySearch(array, x, 0, n - 1);
  if (result == -1)
    printf("Not found");
  else
    printf("Element is found at index %d", result);
}
二分探索の複雑さ

    時間の複雑さ

  • 最良の場合の複雑さ:O(1)
  • 平均的なケースの複雑さ:O(log n)
  • 最悪の場合の複雑さ:O(log n)

    空間の複雑さ
    二分探索の空間の複雑さはO(n)です。

二分探索の応用
  • Java、.Net、C ++ STLライブラリで使用
  • デバッグ中に、バイナリ検索を使用してエラーが発生した場所を特定します
参考文献

[1]パレワラボPvt。Ltd.Binary Search [EB / OL] .https://www.programiz.com/dsa/binary-search,2020-01-01。

おすすめ

転載: blog.csdn.net/zsx0728/article/details/115047976