整数の配列があるとします(例:[1 5 3 4 6])。要素は次の規則に従って再配置されます。すべての要素は前方に(左に向かって)飛び越えて、その要素が飛び越した指数でスライドできます。プロセスは、第2のインデックス(すなわち、5)の要素から始まる。要素1をホップするか、独自の位置にとどまるかを選択できます。ホップすることを選択すると、要素1がインデックス2にスライドします。ホップすることを選択し、結果の配列が[5 1 3 4 6]。エレメント3は1または2ポジションでホップでき、プロセスが繰り返されます。 1つの位置を3ホップ上回ると、配列は[5 3 1 4 6]になり、2つの位置をホップすると[3 5 1 4 6]になります。ソースと最終配列が与えられた場合、2次の時間の複雑さよりも小さい値でソースからfinalを生成するホップ数を見つけてください。
要素のすべての可能な置換がこのように可能であることを示すことは非常に容易です。また、最終的な構成には、固有の一連の発生によって到達することができます。
最後の配列とソース配列が与えられたら、ソースから最終配列に到達するために必要なホップの総数を求めます。 O(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)を作成するたびにマップを更新する必要があります。
P.S.私はベイジアンの2つの順列の間の相関関係をモデル化しようとしていますが、これはそれの副次的な問題です。問題を簡単にするために生成プロセスを変更することについてのアイデアも役立ちます。
編集:私は自分の答えを見つけました。これはまさにケンドール・タウの距離です。これをO(NlogN)で見つける簡単なマージソートベースのアルゴリズムがあります。
あなたのO(N^2)アルゴリズムは何ですか? – v78
なぜ「答えは3」になるのですか?ここに2ホップあります.3ホップから1ホップ、5ホップから2ホップです。また、配列内の整数は一意であるとは限りませんか? –
@AlexanderAnikinあなたはあなたの右手ではなく、あなたの左手に向かって進むことができます。 3は一番左の位置にあるので、有効なホップはありません。現在のホップ数が1である[5,3,1,4,6]を与える3と位置を交換するために5ホップする。次に、要素1は現在の配列[1,5,3,4 、6]。図4および図6はすでに所望の位置にある。したがって、ホップ数は3になります。 –