漸近成長による関数のソート


35

たとえば、関数のリストがあるとします

nlog⁡log⁡(n),2n,n!,n3,nln⁡n,…

どのようにそれらを漸近的にソートするのですか?

f≤Og⟺f∈O(g)、

それらが実際にペアワイズ比較可能であると仮定すると(こちらも参照)?の定義を使用するのは厄介に思えますが、適切な定数および存在を証明するのは難しい場合がよくあり。Ocn0

これは複雑さの尺度に関するものであるため、としての漸近的な挙動に興味がありn→+∞、すべての関数が非負の値()のみを取ると仮定します。∀n,f(n)≥0


4
OPが戻ってこないので、ローカライズされたものを削除し、これから参照質問を作成します。
— ラファエル

回答:


48

厳密な証明が必要な場合は、次の補題が役立つことがよくあります。定義よりも便利です。

もしが存在する、次いでc=リムn→∞f(n)g(n)

  • c=0 ⟺f∈o(g)、
  • c∈(0、∞)⟺f∈Θ(g)および
  • c=∞   ⟺f∈ω(g)。

これにより、アルゴリズム分析で登場するほとんどの機能を注文できるようになります¹。演習として、それを証明してください!

もちろん、それに応じて制限を計算できる必要があります。複雑な機能を基本的な機能に分解するための便利なトリックは次のとおりです。

  • 両方の関数をとして表現し、指数を比較します。それらの比率がまたは傾向がある場合、元の商も同様です。 0 ∞e…0∞
  • より一般的には、次のように商を書き直すことができるように、凸で連続的に微分可能で厳密に増加する関数がある場合h

    f(n)g(n)=h(f∗(n))h(g∗(n))、

    とg∗∈Ω(1)

    リムn→∞f∗(n)g∗(n)=∞、

    それから

    リムn→∞f(n)g(n)=∞。

    このルールの厳密な証明については、こちらをご覧ください(ドイツ語)。

  • 実数に対する関数の継続を検討してください。L'Hôpitalのルールを使用できるようになりました。その条件²に注意してください!

  • 個別の同等物、Stolz–Cesàroをご覧ください。
  • 階乗がポップアップしたら、スターリングの式を使用します:

    n!〜2πn(ne)n

また、一度証明した基本的な関係のプールを保持し、次のように頻繁に使用すると便利です。

  • 対数は多項式よりも遅くなります、すなわち

    α 、β > 0(ログ⁡n)α∈o(nβ)すべてについて。α、β>0

  • 多項式の次数:

    α<βnα∈o(nβ)すべてについて。α<β

  • 多項式は指数関数よりも遅くなります:

    αC>1nα∈o(cn)すべてについておよび。αc>1


制限が存在しないため、上記の補題が適用されない場合があります(関数が発振する場合など)。この場合、limes Superior / Inferorを使用して、Landauクラスの次の特性化を検討してください。

我々はcs:=リムサップn→∞f(n)g(n)

  • 0≤cs<∞⟺f∈O(g)および
  • cs=0⟺f∈o(g)。

我々はc私:=lim infn→∞f(n)g(n)

  • 0<c私≤∞⟺f∈Ω(g)および
  • c私=∞⟺f∈ω(g)。

さらに、

  • 0<ci,cs<∞⟺f∈Θ(g)⟺g∈Θ(f)および
  • ci=cs=1⟺f∼g。

あなたが私の表記に混乱している場合は、こことここをチェックしてください。


¹Nota bene:私の同僚は、多くの関数に対してこれを成功させるMathematica関数を書いたので、補題は本当にタスクを機械的計算に減らします。

²こちらもご覧ください。


@Juho公開されていませんが、わかりませんが、自分で書くのは基本です。Limit[f[n]/g[n], n -> Infinity]ケースの区別を計算して実行します。
— ラファエル

20

別のヒント:関数に単調関数(logやexpなど)を適用すると、物事がより明確になることがあります。


5
これは慎重に行う必要があります: 、ただし。2n∈O(n)22n∉O(2n)
— シャール

2
出向。「モノトーン関数を適用する」ことは、一般的には機能しない何らかの民間伝承のようです。私たちは十分な基準に取り組んでおり、私の答えの最新の改訂版で私が投稿したものを思いつきました。
— ラファエル

17

Skienaは、著書 『アルゴリズム設計マニュアル』で最も一般的な機能間の支配関係のソートされたリストを提供しています。

n!≫cn≫n3≫n2≫n1+ϵ≫nlg⁡n≫n≫n1/2
≫lg2⁡n≫lg⁡n≫lg⁡nlg⁡lg⁡n≫lg⁡lg⁡n≫α(n)≫1

ここで、は逆アッカーマン関数を示します。α(n)


それは奇妙に具体的なリストです。リレーションの多く(正確に意味するものは何でも)は、より一般的な補題にまとめることができます。≫
— ラファエル

それは彼の支配関係の表記法です。
— ロバートS.バーンズ

11

ヒント:Wolfram Alphaのようなものを使用してこれらの関数のグラフを作成し、それらがどのように成長するかを感じてください。これはあまり正確ではありませんが、十分な数を試してみると、成長の比較パターンが表示されるはずです。もちろんこれは証明に代わるものではありません。

たとえば、1から10000までlog(log(n))をプロットするか、個々のグラフを表示するlog(log(n))をプロットし、1から10000までlog(n)をプロットして比較します。


9
vodooを本当にお勧めしますか?
— ラファエル

関数のグラフを描くことを提案するために+1。
— 伊藤剛

1
あなたが証明したいと思うかもしれないもののヒントとしてグラフを取る。もちろん、そのヒントは間違っているかもしれません。
— gnasher729

8

nログ⁡ログ⁡n2n

n=2ログ⁡nnログ⁡ログ⁡n=(2ログ⁡n)ログ⁡ログ⁡n=2ログ⁡nログ⁡ログ⁡nnログ⁡ログ⁡n=2ログ⁡nログ⁡ログ⁡n∈o(2n)c>0n0n≥n0c(nログ⁡ログ⁡n)=c(2ログ⁡nログ⁡ログ⁡n)<2n

3n2n3n=(2ログ⁡3)n=2nログ⁡32n∈o(3n)=o(2nログ⁡3)

等。


2

Name実行時間一定時間O(1)逆アッカーマン時間O(a(n))反復対数時間O(ログ∗⁡n)対数対数O(nログ⁡n)対数時間O(ログ⁡n)多対数時間poly(ログ⁡n)分数の力O(nc)、どこで 0<c<1線形時間O(n)「nログスターn」時間O(nログ∗⁡n)準線形時間O(nログ⁡n)二次時間O(n2)立方時間O(n3)多項式時間poly(n)=2O(ログ⁡n)準多項式時間2O(poly(ログ⁡n))準指数時間(最初の定義)O(2nϵ)、ϵ>0準指数時間(2番目の定義)2o(n)指数時間(線形指数付き)2O(n)指数時間2poly(n)要因時間O(n!)

poly(バツ)=バツO(1)


1
2nログ⁡n∈o(n!)

1
複雑さのクラスの名前がここで直接話せるように、これを置きました。はい、Landauは暗号化の特定のタイプのアルゴリズムに関するものです。
— ケララカ

1
@Raphaelの見解のいくつかに反対します。私は数学者であり、インストラクターでもあります。これらのことを証明することは別として、このような大きなテーブルは、人々の直感を簡単かつ大幅に高めると信じています。また、漸近クラスの名前は、人々が多くのことを覚えてコミュニケーションするのに役立ちます。
— Apass.Jack

1
@ Apass.Jack私の教育経験では、テーブルを与えられると、多くの生徒がそれを暗記し、テーブルにない機能については注文しません。この効果は、このサイトに上る漸近的成長に関する質問の多くを説明しているように見えることに注意してください。それはもちろん、もしそれが証明をより簡単にするならば、テーブルによって暗示される補題を使用するであろう、しかしそれはテーブルを証明する方法を学んだ後に来る。(その点を強調するために、ここに来た人はテーブルから物を読むのを手伝う必要はありません。関係を証明するのを手伝う必要があります。)
— ラファエル

1
@kelalaka「はい、Landauは暗号化の特定のタイプのアルゴリズムについてです。」-それは意味がありません。ランダウ表記法は、数学関数の特性を記述するための略記法です。暗号自体はもちろん、アルゴリズムとは関係ありません。
— ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.