多くの二分探索の実装における問題?
二分探索アルゴリズムは線形探索アルゴリズムよりも優れていることがわかっています。このアルゴリズムの実行には、O(log n)の時間がかかります。ほとんどの場合、実装されたコードにはいくつかの問題があります。以下のような1つの二分探索アルゴリズム関数を考えてみましょう-
例
int binarySearch(int array[], int start, int end, int key){ if(start <= end){ int mid = (start + end) /2); //mid location of the list if(array[mid] == key) return mid; if(array[mid] > key) return binarySearch(array, start, mid-1, key); return binarySearch(array, mid+1, end, key); } return -1; }
このアルゴリズムは、開始と終了が多数に達するまで正常に機能します。 (開始+終了)が2 32 の値を超えている場合 – 1の場合、ラップアップ後に1つの負の数を返す場合があります。また、負の数は配列インデックスとしてサポートされていないため、問題が発生する可能性があります。
この問題を克服するには、いくつかの異なる方法があります。
方法1
int mid = start + ((end - start) / 2)
2番目のメソッドはJavaでのみ機能します。CまたはC++には>>>演算子がないためです。
方法2(Javaのみ)
int mid = (start + end) >>> 1
>>>はCまたはC++でサポートされていないため、次の方法を使用できます。
方法3
int mid = ((unsigned int) low + (unsigned int) high) >> 1
-
データ構造における最適な二分木
整数のセットはソートされた順序で与えられ、別の配列は頻度カウントに頻繁に与えられます。私たちのタスクは、これらのデータを使用してバイナリ検索ツリーを作成し、すべての検索の最小コストを見つけることです。 サブ問題の解を解いて保存するために、補助配列cost [n、n]が作成されます。コストマトリックスは、ボトムアップ方式で問題を解決するためのデータを保持します。 入力 −ノードおよび頻度としてのキー値。 Keys = {10, 12, 20} Frequency = {34, 8, 50} 出力 −最小コストは142です。 これらは、指定された値から可能なBSTです。 ケース1の
-
C#での二分探索
バイナリ検索はソートされた配列で機能します。値は配列の中央の要素と比較されます。同等性が見つからない場合は、値が存在しない半分の部分が削除されます。同様に、残りの半分の部分が検索されます。 これが配列のmid要素です。 62を見つける必要があるとしましょう。そうすると、左側の部分が削除され、右側の部分が検索されます- これらは二分探索の複雑さです- 最悪の場合のパフォーマンス O(log n) ベストケースのパフォーマンス O(1) 平均パフォーマンス O(log n) 最悪の場合のスペースの複雑さ O(1) 例 二分