ヒープソートの最悪のケースを見つける


8

ACM ICPC 2004–2005 Northeastern European contestで問題Hに取り組んでいます。

問題は基本的に、ヒープを構築するためのアルゴリズム(シフトダウン)で最大数の交換を生成する最悪のケースを見つけることです。

  • 入力:入力ファイルにはが含まれています()。n1n50,000
  • 出力:ヒープになるように、からまでの異なる整数を含む配列を出力します。これをソートされた配列に変換すると、シフト操作の交換の合計数が最大になります。n1n

入力例:6
対応する出力:6 5 3 2 4 1

そして基本的な出力:

[2, 1]   
[3, 2, 1]   
[4, 3, 1, 2] 
[5, 4, 3, 2, 1] 
[6, 5, 3, 4, 1, 2]

2
あなたは基本的に「なぜ私のコードはとても遅いのですか」と尋ねていますか?私はこの質問があまりにもローカライズされていると思うし、とにかくでより良い属するスタックオーバーフロー
蘭G.

いいえ、本当に、ヒープソートアルゴリズムの最悪のケースを見つけたいです。しかし、私のコードはこれらのケースを理解しようとする試みです。
jonaprieto 2012

2
配列の可能なすべての順序でヒープソートを試したい場合、アルゴリズムが極端に遅いことはそれほど驚くことではありません。実行時間は少なくともであり、指数関数的に増加します。10!すでに360万です。あなたは理論的な分析でより良いでしょう。(質問の冒頭を読み違えたためコメントを再投稿したため、コメントの2番目の部分は無効でした)Ω(n!)
Alex ten Brink 2012

この論文は適合しているようです。私は2番目のランです。定型文なしで質問できるように質問を編集してください。
ラファエル

これは役に立つかもしれません。

回答:


4

以下のための最悪の場合を考えると、我々はのために最悪のケースを構築することができ、我々が取る次のように私たちは「スワップ・サイクル」を行います。次のように、それを入れて、そして我々はスワップその子の最大要素であるまたは、その子の最大要素と再び交換し、以下同様に要素のヒープを離れるまで、その時点で最後の要素を番目の位置に配置します。nn+1n+1a[0]a[0]a[1]a[2]nn+1

例:の最悪のケースはです。ヒープを作成する6を入れ替えて、その後2で終わり、最後に挿入します:。n=5[5,4,3,2,1][6,5,3,4,1][6,5,3,4,1,2]

上記の方法は帰納法で機能します要素の最悪の結果から始め、逆にシフトダウン操作を実行して、実行する必要があるスワップの数を最大化します( swaps)。これより多くのスワップを実行することはできないため、最初のextract-min操作の後でスワップの数を最大化します。その後、次のextract-min操作で要素のワーストケースが正確に残ります。これは、スワップの数が実際に最大であることを意味します。n1log(n)n1

この方法では、得られた結果が異なることに注意してください。

[1]
[2, 1]
[3, 2, 1]
[4, 3, 1, 2]
[5, 4, 1, 3, 2]
[6, 5, 1, 4, 2, 3]
[7, 6, 1, 5, 2, 4, 3]
[8, 7, 1, 6, 2, 4, 3, 5]
[9, 8, 1, 7, 2, 4, 3, 6, 5]
[10, 9, 1, 8, 2, 4, 3, 7, 5 ,6]

ただし、どちらのソリューションも正しいです。

[5, 4, 1, 3, 2]
[2, 4, 1, 3| 5]
[4, 2, 1, 3| 5]
[4, 3, 1, 2| 5]
[2, 3, 1| 4, 5]
[3, 2, 1| 4, 5]

[5, 4, 3, 2, 1]
[1, 4, 3, 2| 5]
[4, 1, 3, 2| 5]
[4, 2, 3, 1| 5]
[1, 2, 3| 4, 5]
[3, 2, 1| 4, 5]

[6, 5, 1, 4, 2, 3]
[3, 5, 1, 4, 2| 6]
[5, 3, 1, 4, 2| 6]
[5, 4, 1, 3, 2| 6]
[2, 4, 1, 3| 5, 6]
[4, 2, 1, 3| 5, 6]
[4, 3, 1, 2| 5, 6]
[2, 3, 1| 4, 5, 6]
[3, 2, 1| 4, 5, 6]

[6, 5, 3, 4, 1, 2]
[2, 5, 3, 4, 1| 6]
[5, 2, 3, 4, 1| 6]
[5, 4, 3, 2, 1| 6]
[1, 4, 3, 2| 5, 6]
[4, 1, 3, 2| 5, 6]
[4, 2, 3, 1| 5, 6]
[1, 2, 3| 4, 5, 6]
[3, 2, 1| 4, 5, 6]

しかし、これらの例はヒープではありません!
jonaprieto 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.