web-dev-qa-db-ja.com

O(1)、O(n)、O(n * n)メモリの意味は何ですか?

可能性のある複製:
Big Oのわかりやすい英語の説明

アルゴリズムの時間の複雑さが語られるときは、多くの場合、メモリも考慮されます。 big-O(1)、big-O(n)、big-O(n * n)メモリの意味は何ですか?

そして、それは時間の複雑さにどのように関係していますか?

22
Eight

Xmoexが言ったように:

o(1)は、一定のメモリ使用量を構成します。したがって、入力の量は重要ではありません。

o(n)は、線形メモリ使用量を構成します。したがって、入力が多いほど、メモリが直線的に多くなります。

o(n * n)は2次メモリ使用量を構成します。したがって、より多くの入力は、2次的により多くのメモリ(平均でx ^ 2)を意味します。

ほとんどの場合、このメモリの複雑さの測定値は、時間の複雑さの測定値から完全に独立しています。コンピュータアルゴリズムの場合、アルゴリズムがこれらの複雑さの両方を管理してアルゴリズムの品質を決定する方法を知ることが重要です。ただし、どちらも個別に計算する必要があります。問題の使用例と状況によっては、どちらか一方が他方よりも重要になる場合があります。

21
mikecline

o(1)は、入力のサイズに関係なく、一定の平均メモリ使用量を意味します
o(n)は、処理している要素がn個ある場合、平均メモリニーズが直線的に増加することを意味します
o(n * n)は、処理している要素がn個ある場合、平均メモリニーズが2次式に増加することを意味します

いわゆる big o表記 についてのWiki記事があります(少しoもカバーしています...)

6
xmoex

ここで誰もがビッグオー表記法の意味を説明しました。それで、私はそれを再び説明するつもりはありません。しかし、私はあなたに簡単に説明します。

ループのない小さなプログラムを取り上げます。

{ int a=1;
print("%d",a);
}

このプログラムの実行には、ごくわずかな時間がかかります。宣言と印刷には単位時間を要します。したがって、その時間の複雑さはO(1)になります

1つのループを持ち、n回実行される別のプログラム

{int a,i;
long n=10000000;
for(i=0;i<n;i++)
    // doing some calculations
}

ここでわかるように、宣言にかかる時間はごくわずかです。つまり、O(1)です。そして、その行を4にすると、時間の単位、つまりO(n)がかかります。次に、全体的な時間の複雑さは

O(1)+O(n)=O(n).

これで、uはO(n * n)について、つまり2つのループについて理解できます。

よりよく理解するために...

ソートされていないリストでアイテムを検索する= O(n)

2つのn桁の数値に単純なアルゴリズムまたはバブルソート= O(n * n)を掛ける

バイナリ検索= O(log n)でソートされた配列内のアイテムを見つける

総当たりのセールスマン問題= O(n!)

2
Ravi Kumar

ここでbig-Oまたは little-O のどちらを意味するのかはわかりませんが、より一般的にお答えします。

それは時間の場合と同じように、メモリについても同じことを意味します。関数がメモリ内で増加する場合O(1)の場合、入力サイズに関係なく一定量のメモリを使用します。関数がメモリ内で増加する場合O(n) =線形量を使用し、O(n * n)は2次量を使用します。

1
Nick Garvey

記憶力の面での複雑さは、処理するアイテムの数を増やしながら、必要なメモリサイズをどれだけ速く拡張するかを意味します。良い例はソートアルゴリズムです。

  • O(1)O(log n)は、Nアイテムのソートに必要なメモリがNアイテムに割り当てられた合計メモリよりも少ないことを意味します。 (別名インプレースソート)
  • O(n)-メモリ消費は線形であるため、アイテムが増加をカウントする限り、メモリ消費は増加します。
  • O(n*n)は、アルゴリズムがさらに多くのメモリを必要とすることを意味します。
1
sll