このチュートリアルでは、バイナリ検索の並べ替えがどのように機能するかを学習します。さらに、C言語の例があります。
二分探索は、ソートされた配列内の要素の位置を見つけるために使用される検索アルゴリズムです。
この方法では、常に部分配列の中央にある要素を検索します。
バイナリ検索は、ソートされたリストにのみ実装できます。要素がまだソートされていない場合は、最初にそれらをソートする必要があります。
二分探索はどのように機能しますか?
二分探索アルゴリズムは、次の2つの方法で実装できます。
- 反復法
- 再帰
再帰的方法は、分割統治法に従います。
これら2つの方法の手順を以下で説明します。
- 検索する配列は次のとおりです
。x= 4が検索する要素であるとします。 - 2つのポインタをそれぞれ最低位置と最高位置に低く設定します。
- 配列の中央の要素を見つけます。たとえば、arr [(low + high)/ 2] = 6です。
- x == midの場合はmidを返し、そうでない場合は検索された要素をmidと比較します。
- x> midの場合、xをmidの右側にある要素の中央の要素と比較します。これは、lowをlow = mid +1に設定することで実行できます。
- それ以外の場合は、xをmidの左側にある中央の要素と比較します。これは、highをhigh = mid-1に設定することで実行できます。
- 低値が高値に達するまで、手順3〜6を繰り返します。
- 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。