標準ライブラリのあまり知られていない部分を閲覧しているときに、偶然std::sort_heap
. しかし、 という名前のフリー関数があるため、なぜそれが存在するのかわかりませんstd::sort
。
また、複雑さは同じであることに注意してください。
だから、私の質問は: が存在する理由はsort_heap
何ですか?
sort_heap
入力が既にheapの形式であると仮定します。std::sort
これは、入力の順序にいくつかの制約があるため、理論的には よりも効率的に機能することを意味します (std::sort
すべての入力に対して機能する必要がある とは異なります)。
コメントで述べたように、これらのパフォーマンス上の利点は決して保証されておらず、明らかに入力データに依存していることに注意する価値があります。そのため、パフォーマンスが重要な場合、プロファイリングを回避する方法はありません。
データが既にヒープ プロパティを持っている場合、プロパティのないデータには適用されない明らかな並べ替えアルゴリズムがあります。つまり、ヒープの最大要素を繰り返し削除し、ヒープ プロパティを復元します。これがヒープソートの仕組みです (最初にデータをヒープ化してから、ヒープ プロパティを使用してソートします)。
したがって、ヒープがあり、それをソートしたいとします。を呼び出すこともできますがstd::sort
、std::sort_heap
このアルゴリズムが使用されることを示唆するために存在します[*]。並べ替えのパフォーマンスを向上させる可能性のある手段をプログラマーに提供することは、少なくともある程度は理にかなっています。それが実際に速いかどうかは別の問題です。
ヒープソートstd:sort
としての実装が許可されていることに注意してください。
sort_heap
同じ動作を取得する別の方法があるため、使用できない場合は世界がpop_heap
続きます。元のヒープのより小さな初期セグメントを繰り返し呼び出します。したがって、それが面倒なら、純粋な便利な関数と見なしてください。sort_heap
ただし、これよりも少し良くするために、適用できる最適化がある可能性があります。
C++03 の作成者の考え方に影響を与えた可能性のある歴史的なメモ: SGI バージョンの STL では、sort
introsort を使用するようpartial_sort
に定義され、heapsort を使用するように定義されていました。ただし、それが標準に含める理由とはまったく違うと思います。ヒープアルゴリズムに含めるのは「明らかな」関数でもあります。
sort_heap
[*] の複雑さの要件は、「O(N log N) の比較」ではなく、「最大で N log N の比較」であるため、かなり強力なヒントです。そのため、入力データにヒープ プロパティがある場合、独自の実装が最大でその数の比較を実行することがわかっていない限り、実装はsort_heap
呼び出しを持つことができません。sort
sort
取得元:http ://www.sgi.com/tech/stl/sort_heap.html
sort_heapは、ヒープ[1] [最初、最後)をソートされた範囲に変換します。これは安定した並べ替えではないことに注意してください。同等の要素の相対的な順序が保持されるとは限りません。
std :: sortは、実装に基づいて最悪の場合O(N ^ 2)の複雑さを提供し、ソートされていないデータセットで機能する可能性があります。std :: sort_heapはヒープ上で機能し、常にO(nlogn)を提供します