web-dev-qa-db-ja.com

線形時間対二次時間

多くの場合、いくつかの答えは、与えられた解が線形である、または別の解が二次であると述べています。

違いを作る方法/何が何であるかを特定する

まだ知らない私のような人のために、誰かがこれを最も簡単な方法で説明できますか?

27
Anthony Perot

関係する要素の数に応じて時間がかかる場合、メソッドは線形です。たとえば、配列の要素を出力するforループはほぼ線形です。

for x in range(10):
    print x

range(10)の代わりにrange(100)を出力すると、実行にかかる時間が10倍長くなるためです。 O(N)と書かれていることが非常によくあります。つまり、アルゴリズムを実行する時間または計算の労力はNに比例します。

次に、2つのforループの要素を出力したいとします。

for x in range(10):
    for y in range(10):
        print x, y

Xごとに、yを10回ループします。このため、全体が10x10 = 100の印刷を通過します(コードを実行するだけで表示できます)。 10を使用する代わりに100を使用する場合、メソッドは100x100 = 10000を実行します。つまり、メソッドはO(N * N)またはO(N²)になります。エレメントの数を増やすたびに、計算の労力または時間がポイント数の2乗として増えるためです。

51
Jblasco

これらは、Big O表記とも呼ばれる実行時の複雑さを指している必要があります。これは取り組むべき非常に大きなトピックです。私はウィキペディアの記事から始めます: https://en.wikipedia.org/wiki/Big_O_notation

このトピックを研究していたときに学んだことの1つは、さまざまなサイズのデータ​​セットを使用してアルゴリズムの実行時間をグラフ化することです。結果をグラフ化すると、直線または曲線が成長のいくつかの次数のいずれかに分類できることがわかります。

アルゴリズムの実行時の複雑さを分類する方法を理解すると、アルゴリズムが時間またはメモリに関してどのようにスケーリングするかを理解するためのフレームワークが得られます。これにより、アルゴリズムを相互に大まかに比較および分類することができます。

私は専門家ではありませんが、これはうさぎの穴から始めるのに役立ちました。

典型的な成長の順序は次のとおりです。

  • O(1)-一定時間
  • O(log n)-対数
  • O(n)-線形時間
  • O(n ^ 2)-二次
  • O(2 ^ n)-指数
  • O(n!)-階乗

ウィキペディアの記事を飲み込むのが難しい場合は、iTunes Universityでこのテーマに関するいくつかの講義を見て、アルゴリズム分析、big-O表記法、データ構造、さらには操作カウントのトピックを調べることを強くお勧めします。

幸運を!

31
Ralph Caraveo

指定はしませんが、solutionに言及したように、2次および線形収束について質問している可能性があります。この目的のために、反復アルゴリズムで収束値への一連の近似を生成する場合、次のことを示すことができれば二次収束になります。

 x(n) <= c * x(n-1)^2

正の定数cの場合。つまり、反復n+1での解の誤差は、反復nでの誤差の2乗より小さいということです。より一般的な収束レートの定義については、こちらをご覧ください http://en.wikipedia.org/wiki/Rate_of_convergence

1

通常、入力サイズn(入力が配列またはリストの場合)の観点からアルゴリズムについて議論します。問題の線形解は、実行時間がnで線形にスケーリングするアルゴリズムであるため、x*n + y、ここでxyは実数です。 nは1の最高指数で表示されます:n = n^1

二次解では、nは2を最高指数とする項に現れます。 x*n^2 + y*n + z

任意のnの場合、線形解は2次解よりも実行時間が大幅に遅くなります。

Mor情報については、 Big O Notation を参照してください。

1
Femaref