ソートに関する興味深い問題


14

番号付きのボール(ランダム)が付いたチューブを考えます。チューブにはボールを取り除くための穴があります。1つの操作について次の手順を検討してください。

  1. 穴から1つまたは複数のボールを選択し、ボールを選択した順序を覚えておくことができます。
  2. パイプを左側に傾けて、パイプ内の残りのボールが左側に移動し、ボールを取り除いてできた空のスペースを占有する必要があります。
  3. 番号の付いたボールをパイプから選んだ順序を変更することは想定されていません。ここで、ボールの動きによって作成された空いているスペースを使用して、再びパイプに戻します。

手順1〜3は1つの操作と見なされます。

番号の付いたボールを昇順に並べ替えるのに必要な最小限の操作を見つけます。

例:チューブに次が含まれる場合:[1 4 2 3 5 6]

次にととを取り出し、パイプを左に傾けるとを取得し、パイプの最後にをこの順序で挿入して取得します。456[1 2 3](4 5 6)[1 2 3 4 5 6]

したがって、必要な最小ステップ数は1です。パイプをソートするための最小操作を見つける必要があります。

この問題を解決する方法に関するアイデアやヒントはありますか?


順番が逆の場合は、2、3、...を順番に取り出し、最後に追加する必要があります(操作)。これは明らかに最悪のケースです。n
フォンブランド

2
8,7,6,5,4,3,2,1-> 75318642-> 51627384-> 12345678常に奇数の位置を取り出す。
adrianN

私の答えを要約すると、順列をソートするために必要な操作の最小数はで、は降下の数です。ログ2D π - 1+ 1 Dをπlog2(d(π1)+1)d()
ユヴァルフィルマス

反転を削除するという観点から考えるのが好きです。各操作で、セットと(はボールのセット全体)間の反転を削除できます。したがって、セット慎重に選択する必要があります。S X S XXSXSX
ジョー

回答:


10

以下のプロセスを使用して、で表される置換の実行パーティション番号を定義します。レッツR π π ··· K π π R π πr(π)kmin(π),,kππr(π)

たとえば、計算してみましょう。私たちは、最初に確保さを取得するために、。それからを確保して、を取得します。次に、を確保してを取得します。最後に、を確保して空の順列を取得します。これには4ラウンドかかるため、です。1 6273584 234 6758 5 678 678 r 62735814 = 4r(62735814)1627358423467585678678r(62735814)=4

この表現はソートにどのように役立ちますか?2回ごとに実行(つまり、これらの数値を右に移動してを取得し(編集:順列に表示される順序(つまり))。これで、2つの実行、つまりのみが実行され、を右に移動してリストをソートできます。234 678 51627384 627384 1234 5678 567862735814234,678516273846273841234,56785678

ここで、次の推測を行ってみましょう。置換場合、 1回の移動でから到達可能なすべての置換のセットとします。次に。Π π α Π R α = R π / 2 πΠπminαΠr(α)=r(π)/2

この推測を考えると、動きの最小数は、順列ソートするために必要なことを示すことは容易であるある、と私はすべての順列のために、この公式を確認したのため。ログ2 R π S N N 8πlog2r(π)Snn8

編集:実行パーティション番号の異なる解釈があります。これは、それを計算する線形時間アルゴリズムを提供し、私の推測の証明をスケッチして、式を検証できます。log2r(π)

並べ替えもう一度考えてください。で最初の実行が終了するその理由の点である前に表示されます。同様に、第二ラン端以来表示される前になど。したがって、順列の実行パーティション番号は、の前にが現れるようなの数です。1 2 1 4 5 4 i i + 1 i62735814121454ii+1i

順列の逆を見ると、これをもっと簡潔に述べることができます。もう一度検討してください。テイク。この順列には3つの降下があります:(降下は前の位置よりも小さい位置です)。各下降は、新しい実行の開始に対応します。したがって、は、1にの降下数を加えたものに等しくなります。π - 1 = 72485136 7 2 48 5 1 36 R π π - 1π=62735814π1=7248513672485136r(π)π1

に関して、操作はどのように見えますか?聞かせて、我々は右に移動し、その数字の集合左に滞在その数字の集合とします。我々は数値置き換える上の順列とそれらの相対的な順序を表す、との数字を交換上の順列で。たとえば、移動。逆順列に関しては、です。だからにマッピングされた B A A { 1 ... | A | } B { | A | + 1 | A | + | B | } 6273 5 8 1 451 627384 7 248 5 1362 468 1 357 75 21 248136 468357π1BAA{1,,|A|}B{|A|+1,,|A|+|B|}627358145162738472485136246813577521そしてにマッピングされた。248136468357

の下降は、および場合にのみ操作後に失われます。逆に、に関しては、とへのパーティションは -runsと -runsに対応します。ランが終了してランが開始されるたびに、下降があります。降下を「殺す」ためには、 -runから -run に切り替える必要があります。我々は2つの下りを殺した場合、我々はから途中で切り替えていますに-run降下を被る、-run。π - 1のx A Y B π - 1 A B A B B A A B B Axyπ1xAyBπ1ABABBAABBA

この引数を形式化して、演算を介してから発生する場合、を示すことができます。は、降下の数です。これはと同等であり、私の推測の一方向を証明しています。もう一方の方向はより簡単で、すでに上で概説しました:単に2回実行し、これらの実行を右にプッシュして、を満たす順列を取得します。π D α - 1D π - 1/ 2 D R α R π / 2 α R α = R π / 2 απd(α1)d(π1)/2d()r(α)r(π)/2αr(α)=r(π/2)


あなたは一度に数ラウンドのボールを取り出していますが、それは許可されていません。
フォンブランド

1
それらを順列に現れる順番に取っています。それは合法です。
ユヴァルフィルマス

私は少し混乱しています。[6 5 4 3 2 1]の並べ替えに必要な操作の最小数を説明してください。また、「毎秒実行、つまり234,678を実行し、これらの数値を右に移動して51627384を取得する」と述べましたか?また、r(π)を効率的に計算する方法は?
user6709

1)なので、3つの操作が必要になります。たとえば、654321 531 | 642 51 | 6234 1234 | 56r(654321)=6654321531|64251|62341234|56
ユヴァルフィルマス

2)これらの実行に属するすべての数値を(順列に現れる順序で)取得し、それらを右に移動します。この場合、を使用してそれらを右に移動し、51を左に残します。62738451
ユヴァルフィルマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.