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


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

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

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

回答:


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π⌈log2⁡r(π)⌉Snn≤8

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

並べ替えもう一度考えてください。で最初の実行が終了するその理由の点である前に表示されます。同様に、第二ラン端以来表示される前になど。したがって、順列の実行パーティション番号は、の前にが現れるようなの数です。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 4 ↦ 51 627384 7 248 5 136 ↦ 2 468 1 357 75 21 248136 468357π−1BAA{1,…,|A|}B{|A|+1,…,|A|+|B|}62735814↦5162738472485136↦246813577521そしてにマッピングされた。248136468357

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

この引数を形式化して、演算を介してから発生する場合、を示すことができます。は、降下の数です。これはと同等であり、私の推測の一方向を証明しています。もう一方の方向はより簡単で、すでに上で概説しました:単に2回実行し、これらの実行を右にプッシュして、を満たす順列を取得します。π D (α - 1)≥ ⌊ D (π - 1)/ 2 ⌋ D (⋅ )R (α )≥ ⌈ R (π )/ 2 ⌉ α R (α )= ⌈ R (π / 2 )⌉απd(α−1)≥⌊d(π−1)/2⌋d(⋅)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 | 56。r(654321)=6654321→531|642→51|6234→1234|56
— ユヴァルフィルマス

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