質問

よく知られている最悪のケースがあります$ o(n)$ 選択アルゴリズム 整数の配列で$ k $ '最大の要素を見つける。それはaを使用します 中央医療者 十分なピボットを見つけるためのアプローチ、入力配列を所定の位置に分割し、$ k $ '最大の要素を検索する際に再帰的に継続します。

入力配列に触れることが許可されていない場合、$ o(n)$時間の$ k $ '最大の要素を見つけるために、どれだけの余分なスペースが必要になるか? $ k $ '最大の要素を$ o(1)$ $ extra spaceで見つけることができますが、実行時間$ o(n)$を維持できますか?たとえば、最大要素または最小要素を見つけるには、$ o(n)$ timeと$ o(1)$スペースが必要です。

直感的には、$ o(n)$スペースよりもうまくやれると想像することはできませんが、これの証拠はありますか?

誰かが参照を指しているか、$ lfloor n/2 rfloor $ 'th要素が$ o(n)$ $ spaceを$ o(n)$ timeで見つける必要がある理由を議論することができますか?

役に立ちましたか?

解決

入力を変更せずに$ o(n)$ timeと$ o(1)$ $ offriceメモリセルで選択を行うことができる場合、これはオープンな問題です(参照 ここ)。しかし、あなたはこれにかなり近づくことができます。

マンローとラマンは提案しました 選択のためのアルゴリズム $ o(n^{1+ varepsilon})$の時間で実行されますが、$ o(1/ varepsilon)$ extra Storage(セル)のみを使用します。このアルゴリズムは、入力を変更せずに残します。小さな$ varepsilon> 0 $を選択できます。

そのコアでは、MunroとRamanのアルゴリズムは古典的な$ o(n)$ algorithmとして機能します: バウンド(呼び出し フィルター)、既知のランクを持つ2つの要素です。要求された要素は、2つのフィルターの間に含まれています(ランクごと)。優れたピボット要素$ P $を選択することにより、フィルターに対してすべての数値と$ p $を確認できます。これにより、フィルターを更新し、チェックするために残っている要素の数を減らすことができます(ランクごと)。リクエスト要素が見つかるまで繰り返します。

古典的なアルゴリズムと違うのは、$ p $の選択です。 $ a(k)$を$ varepsilon = 1/k $の選択を解決するアルゴリズムとします。アルゴリズム$ a(k)$は、配列を同等のサイズのブロックに分割し、多くの要素があるブロックを識別します。このブロックは、アルゴリズム$ a(k-1)$の助けを借りて、良好なピボット要素を求めてスキャンされます。再帰アンカーは、些細な$ a(1)$ algorithmです。適切なブロックサイズ(および数学を行う)により、上記のように実行時間とスペースの要件が得られます。

ところで、あなたが探しているアルゴリズムは最近名前が付けられました 一定作業スペースアルゴリズム.

私は下限を知りません。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top