2

整数の配列があるとします (例: [1 5 3 4 6])。要素は、次の規則に従って再配置されます。すべての要素は前方 (左方向) にホップし、ホップしたインデックス内の要素をスライドできます。プロセスは、2 番目のインデックス (つまり 5) の要素から開始します。要素 1 を飛び越えるか、それ自体の位置にとどまるかを選択できます。要素 1 が飛び越えることを選択した場合、要素 1 はインデックス 2 までスライドします。飛び越えることを選択したと仮定し、結果の配列は [5 1 3 4 6]。要素 3 は 1 つまたは 2 つの位置を飛び越えることができ、プロセスが繰り返されます。1 つの位置を 3 回ホップすると、配列は [5 3 1 4 6] になり、2 つの位置をホップすると [3 5 1 4 6] になります。

このようにして、要素のすべての可能な順列が可能であることを示すのは非常に簡単です。また、一意のオカレンス セットによって、最終的な構成に到達することもできます。

問題は、最終配列とソース配列が与えられた場合、ソースから最終配列に到達するために必要なホップの総数を見つけることです。AO(N^2) の実装は簡単に見つかりますが、これは O(N) または O(NlogN) で実行できると思います。また、O(N2) よりもうまくできない場合は、それを知っておくとよいでしょう。

たとえば、最終配列が [3,5,1,4,6] でソース配列が [1,5,3,4,6] の場合、答えは 3 になります。

私の O(N2) アルゴリズムは次のようなものです。移動する最後の要素であることがわかっているため、ソース配列のすべての位置を最後からループします。ここでは 6 になり、最終的な配列での位置を確認します。必要なホップ数を計算し、最終的な配列を再配置して、その要素をソース配列の元の位置に配置する必要があります。再配置ステップは配列内のすべての要素を対象とし、プロセスはすべての要素をループするため、O(N^2) になります。ハッシュマップまたはマップを使用すると検索に役立ちますが、O(N^2) になるすべてのステップの後にマップを更新する必要があります。

PSベイジアンの方法で2つの順列間の相関をモデル化しようとしていますが、これはそのサブ問題です。問題をより単純にするために生成プロセスを変更するアイデアも役に立ちます。

編集:答えが見つかりました。これは、まさにケンドール タウ距離が行うことです。O(NlogN)でこれを見つけるための簡単なマージソートベースのアルゴリズムがあります。

4

2 に答える 2

1

ターゲット配列を順序付けと見なします。ターゲット配列は、ラベルを付け直すだけで、 と見なす[2 5 4 1 3]ことができます[1 2 3 4 5]。要素を一定時間で比較できるようにするには、マッピングを知っているだけで済みます。このインスタンスでは、比較45てチェックします: index[4]=2 > index[5]=1(ターゲット配列内) など4 > 5(意味:末尾4の右側にある必要があります)。5

だから、あなたが本当に持っているのは、バニラのソートの問題です。順序は、通常の番号順とは異なります。変更されるのは、比較関数だけです。あとは基本的に同じです。O(nlgn)、またはO(n)(基数ソート)でソートを実行できます。とはいえ、いくつかの追加の制約があります。その場で並べ替える必要があり、隣接する 2 つの要素のみを交換できます。

強力で単純な候補はselection sortで、これは時間内にそれを行いますO(n^2)。反復ごとに、「配置されていない」部分の「左端」の残りの要素を特定し、「配置された」部分の最後に到達するまでそれを交換します。O(nlgn)適切なデータ構造 (時間内に「最も左にある」残りの要素を識別するための優先キュー) を使用することで改善できますO(lgn)。は比較ベースの並べ替えの下限であるためnlgn、それ以上のことはできないと思います。

編集:したがって、スワップのシーケンスにはまったく関心がなく、必要な最小数のスワップのみに関心があります。これはまさに配列内の反転の数です(特定のニーズに合わせて調整されます: 「非自然順序付け」比較関数ですが、数学は変わりません)。その主張の証明については、この回答を参照してください。

反転の数を見つける 1 つの方法は、マージ ソート アルゴリズムを適応させることです。実際に配列をソートして計算する必要があるため、まだO(nlgn)時間があることがわかります。実装については、この回答またはこれを参照してください(繰り返しますが、適応する必要があることに注意してください)。

于 2016-11-11T16:23:03.937 に答える