1

リストの最小数を見つける簡単な方法は、単純にn回の比較であり、2番目に小さい数が必要な場合は、もう一度調べるか、最初の反復中に別の変数を追跡することができます。いずれにせよ、これは両方の数値を見つけるために2nの比較を必要とします。

したがって、n個の異なる要素のリストがあり、最小のものと2番目に小さいものを見つけたいと仮定します。はい、最適なアルゴリズムは最大でn + Chief(lg n)-2回の比較を行います。(ただし、最適な方法には興味がありません)

しかし、2nの比較を行う簡単なアルゴリズムを使用せざるを得ないとします。最悪の場合、2n回の比較が必要になります。しかし、平均はどうですか?簡単なブルートフォースアルゴリズムを使用して最小と2番目に小さいものを見つけるのにかかる平均比較数はいくつですか?

編集:それは2nより小さくなければならないでしょう-(以下の私のコメントからコピーして貼り付けました)私は2番目に小さいものを追跡しているtmp2変数と私がいるインデックスを比較します。現在のインデックスの値がtmp2より小さい場合を除いて、最小値を追跡しながらtmp1変数と再度比較する必要はありません。したがって、比較の数を2nから減らすことができます。それでもn以上かかるでしょう。はい、最悪の場合、これでも2nの比較が必要になります。しかし、平均してすべてがランダムに入れられた場合...

n +何かの比較になると思いますが、2番目の部分がわかりません。どういうわけかlognを巻き込む方法があると思いますが、それを証明する方法について何かアイデアはありますか?

(同僚が昼食時にこれを私に尋ねました、そして私は困惑しました。申し訳ありません)もう一度、それはちょっと一般的な知識なので、私は最適なアルゴリズムに興味がありません。

4

1 に答える 1

2

コメントで指摘したように、繰り返しの現在の要素がこれまでに見つかった 2 番目に小さい要素よりも大きい場合、2 回目の比較は必要ありません。k 番目の要素を見た場合、2 番目の比較の確率は?

これは次のように言い換えることができると思います。最初の k 個の要素を順序付けられたリストと考えると、すべての位置は k 番目の要素に対して 1/k の確率が等しくなりますが、最小の位置と 2 番目に小さい位置の 2 つだけです。 、2 番目の比較を引き起こします。したがって、2 回目の比較の数は、sum_k=1^n (2/k) = 2 H_n (n 次の高調波数) となります。これは、実際には 2 番目の比較の期待値の計算です。乱数は、2 番目の比較を行う必要があるイベントを表します。2 番目の比較を行う必要がある場合は 1 であり、1 回だけ比較を行う必要がある場合は 0 です。 .

これが正しければ、平均的なケースでの比較の総数は C(n) = n + 2 H_n であり、私の知る限り H_n = theta(log(n)), C(n) = theta(n + log(n)) です。 = シータ(n)

于 2013-03-10T21:33:21.390 に答える