これはほぼ 1 年後のことですが、私には答えがあると思います。半順序の発見です。
全体の順序でソートすることを少し考えてみてください。n 個のオブジェクトのシーケンス (これらは異なるものと仮定します) と、2 つの要素をテストして一方が他方より小さいかどうかを確認する比較操作があります。
要素がどの順列にあるかを発見しようとしています。n! 個あります。可能な順列なので、1 から n! までの数を見つけようとしています。比較するたびに、1 ビットの情報が得られます。1からnまでの数を発見するために!log(n!) ビットを検出する必要があります。したがって、必要な比較の数も log(n!) ビット、つまり次のようになります。
log(n!) = n log n + o(n log n) = Ω(n log n) ビット
(もちろん、すべての対数は底が 2 です。)
これ以上のことはできません。各クエリが 1 ビットの情報を提供し、少なくとも Ω(n log n) ビットを検出する必要がある場合、Ω(n log n) 比較が必要です。もっとうまくやれると思うなら、シャノン、チャイティン、コルモゴロフと一緒にやってみてください。
しかし、さらに優れているのは、最悪の場合でもそれを実行できるアルゴリズムが知られていることです (例: ヒープ ソート)。その意味で、ヒープソートは漸近的に最適です。
(複数ビットの情報を返すクエリ操作がある場合は、より適切に実行できることに注意してください。たとえば、Ω(log n)ビットを返すクエリ操作を考え出すことができれば、Ωでソートできるはずです(n) 時間。詳細については、基数ソートを参照してください。)
この分析は、あらゆる種類のアルゴリズムで機能します。n 個の一連のものの中から 1 個のものを見つけるには、1 から n の間の数を発見する必要があります。つまり、log n + O(1) ビットを発見することを意味します。クエリ操作が 1 ビットを返す場合、検索には Ω(log n) クエリが必要です。(詳細については、二分探索を参照してください。)
これで私がどこに向かっているのかがわかると思います。
ここで、半順序関係を持つ n 個の要素があるが、それが何であるかわからず、調べたいとします。ただし、2 つの要素 x と y を比較し、半順序で x が y 以下の場合に「true」を返すクエリがあります。
Ω(n^2) 時間かかる半順序を発見する明白なアルゴリズムがあります: 各要素を他の要素と比較するだけです。
しかし、これは最適ですか?さて、クエリ操作は 1 ビットの情報を返します。n 個の要素の半順序の数は、Sloane の A001035によって与えられます。私が正しく読んでいれば、このシーケンスは Ω(2^(n^2)) です。つまり、半順序を発見するには、次のものが必要です。
Ω(log 2^(n^2)) = Ω(n^2) ビット
つまり、Ω(n^2) 時間を超えることはできないため、これは漸近的に最適なアルゴリズムです。
「それで」、「入力のサイズが n であるという事実を購入します。しかし、出力のサイズはO(n^2) ではないので、実際には深い技術的な意味で線形アルゴリズムです。」 ?」
うーん...多分。今は詳細に入る時間があまりありませんが、質問でお答えします。
昔ながらの並べ替えの場合、n 個の個別の要素が与えられることがあります。区別するには、n 個の異なるラベルでラベル付けする必要があります。n 個の個別のラベルを格納するということは、それぞれが 1 から n の間の n 個の数値を格納することを意味します。これらの各数値を表すには log n ビットが必要なので、問題の合計サイズは n log nビットになります。では、ヒープの並べ替えは問題のサイズに線形であると言ってみませんか?