iAmortized cost は、考えられるすべてのクエリの合計コストを、考えられるクエリの数で割ったものです。アイテムを見つけられなかったクエリをどのようにカウントするかによって、わずかに異なる結果が得られます。(まったくカウントしないか、不足している可能性のあるギャップごとに 1 つカウントします。)
したがって、2^n - 1 項目の検索の場合 (数学を単純にするための例として)、最初のプローブで 1 つの項目が見つかり、2 番目のプローブで 2 項目が見つかり、3 番目のプローブで 4 項目が見つかります。 , ... n 番目のプローブで 2^(n-1)。不足しているアイテムには 2^n の「ギャップ」があります (両端をギャップとして数えることを忘れないでください)。
あなたのアルゴリズムでは、プローブ k でアイテムを見つけるのに 2k-1 の比較コストがかかります。(これは、k 番目より前の k-1 個のプローブのそれぞれについて 2 回の比較に加えて、== のテストが true を返す場合に 1 回です。) テーブルにない項目を検索するには、2n 回の比較が必要です。
計算はあなたに任せますが、二分探索がこのようにコーディングされているのを見て、私がどれほど腹立たしいかを表現せずにこのトピックを離れることはできません。検討:
public static boolean binarySearch(int x, int[] sorted {
int s = 0; // start
int e = sorted.length; // end
// Loop invariant: if x is at sorted[k] then s <= k < e
int mid = (s + e)/2;
while (mid != s) {
if (sorted[mid] > x) e = mid; else s = mid;
mid = (s + e)/2; }
return (mid < e) && (sorted[mid] == x); // mid == e means the array was empty
}
探しているアイテムにヒットしたときにループを短絡させませんが、これは欠陥のように見えますが、一方で、アイテムごとに 2 つの比較ではなく、見るすべてのアイテムに対して 1 つの比較のみを行います。それは一致しません。すべてのアイテムの半分が検索ツリーのリーフで見つかるため、欠陥のように見えるものが大きな利益になることがわかります。実際、ループを短絡することが有益な要素の数は、配列内の要素数の平方根にすぎません。
算術を精査し、償却された検索コストを計算します (「コスト」をsorted[mid]との比較の数としてカウントすると、このバージョンは約 2 倍高速であることがわかります。コストも一定です (±1 比較以内)。 , 配列内のアイテムの数のみに依存し、アイテムがどこにあるか、またはアイテムが見つかったかどうかにも依存しません.それは重要ではありません.