2016-09-24 4 views
1

私は、無作為化・セレクトオンラインの反復バージョンのコードが見つかりました:ランダム化された選択の反復バージョンは何をしますか?

RANDOMIZED-SELECT(A,p,r,i) 
    while p < r do 
     q ← RANDOMIZED-PARTITION(A,p,r) 
     k ← q – p +1 

     if i ≤ k then 
      r ← q 
     else 
      p ← q + 1 
      i ← i – k 

    return p 

誰かが最後まで私< = kの場合からのコードの一部が何を私に説明することができれば、私はそれを本当に感謝でしょうか?再帰版とは何が違うのですか?

+0

どのような言語ですか?タグを付ける必要があります。いずれにしても、おそらく答えは「ランダム化区画」が何をするかに依存するでしょう。おそらくあなたはそれが何であるか教えてくれるでしょう。 –

+0

@JohnColeman:これは、Cormenらによる「Introduction to Algorithms」の擬似コードのように見えます。アルゴリズムは無作為化された「配列の中でi番目の最小要素を見つける」、[Quickselect](https://en.wikipedia.org/wiki/Quickselect)としても知られています。 'RANDOMIZED-PARTITION'はランダムな要素を選択し、要素がその要素の以下かどうかに基づいて配列を分割し、次に左の区画の最後の要素のインデックスを返します。 (しかし、はい、OPはこれを述べているはずです) –

+0

@AasmundEldhusetありがとうございました。私はそれが疑似コードかもしれないと思ったが、それはまた、それがいくつかのコンピュータ代数システムから来た可能性があるように見える。あなたの答えは素晴らしく、upvoteの価値があります。 –

答えて

2

pおよびrは、番目の要素を検索するAの範囲の左右のインデックスです。最初のパーティション分割の後、2つのパーティションのそれぞれにいくつの要素があるかをチェックします。左側のパーティションにi個以上の要素がある場合は(kと表示されます)、そこで検索を続ける必要があります。その場合は、範囲の右端(r)をパーティション(q)。そうでない場合は、探している要素が正しいパーティションのどこかにあるため、範囲の左端(p)を分割の右側の要素(q + 1)に設定する必要があります。範囲今度は右にシフトしたので、それに合わせてiを調整する必要があります(最初の8番目の要素を探していて、左側のパーティションに3つの要素がある場合は、右側のパーティションの5番目の要素を検索する必要があります)。

インデックスのこの調整は、再帰バージョンでも実行する必要がありますが、通常は再帰呼び出しで行われるため、後者の場合はRANDOMIZED-SELECT(A, q + 1, r, i - k)のようになります。

+1

非常に明確な説明。どうもありがとうございます :)! – useruser1412

+0

@ useruser1412:うれしいわ! –

関連する問題