O(1)、O(n log n)、およびO(log n)の複雑度を持つアルゴリズムの例


114

O(1)、O(n log n)、O(log n)の複雑さを備えた、私たちが毎日使用するいくつかのアルゴリズムは何ですか?


6
なぜwikiなのか?それは世論調査でも主観的でもありません。彼女は、big-Oプロパティの具体例を求めています。
paxdiablo 2009年

4
ウィキは正解が1つではないため、複数の答えがあります。
Jason S、

2
ウィキペディアにも良いリストがあります。 en.wikipedia.org/wiki/Time_complexity
Homer6、2014年

回答:


234

質問で与えられた時間の複雑さを伴うアルゴリズム/ステートメントのグループの例が必要な場合は、ここに小さなリストがあります-

O(1) 時間

  • 配列インデックスへのアクセス(int a = ARR [5];)
  • リンクリストへのノードの挿入
  • スタックへのプッシュとポップ
  • キューへの挿入と削除
  • Arrayに格納されているツリー内のノードの親または左/右の子を見つける
  • 二重リンクリストの次/前の要素にジャンプする

O(n) 時間

簡単に言えば、すべてのブルートフォースアルゴリズム、または線形性を必要とするNoobアルゴリズムは、O(n)時間の複雑さに基づいています。

  • 配列をトラバースする
  • リンクされたリストをトラバースする
  • 線形検索
  • リンクリスト内の特定の要素の削除(並べ替えなし)
  • 2つの文字列の比較
  • 回文のチェック
  • カウント/バケットソートとここにも100万以上のそのような例を見つけることができます。

O(log n) 時間

  • バイナリ検索
  • 二分探索木で最大/最小数を見つける
  • 線形機能に基づく特定の分割統治アルゴリズム
  • フィボナッチ数の計算-最良の方法ここでの基本的な前提は、完全なデータを使用せず、反復ごとに問題のサイズを小さくすることです

O(n log n) 時間

「log n」の要素は、分割統治を考慮することによって導入されます。これらのアルゴリズムのいくつかは最適化されたもので、頻繁に使用されます。

  • マージソート
  • ヒープソート
  • クイックソート
  • O(n ^ 2)アルゴリズムの最適化に基づく特定の分割統治アルゴリズム

O(n^2) 時間

これらのO(nlogn)対応物が存在する場合、これらのアルゴリズムは効率の低いアルゴリズムになるはずです。一般的なアプリケーションは、ここではブルートフォースです。

  • バブルソート
  • 挿入ソート
  • 選択ソート
  • 単純な2D配列のトラバース

5
nはどうですか?どのような一般的なアルゴリズムがnを使用しているのか疑問に思っていました!?
Y_Y 2014年

HashMap値、およびHRUマップと二重リンクリストを使用してO(1)を実現するLRU実装などのより複雑なアルゴリズムにアクセスするか、PUSH / POP / MIN機能でスタックを実装します。また、フィボナッチの再帰的な実装はN!に該当します。
田舎のコーダー2014年

11
私のOCDは、O(log n)リストがリストの前になるように切り替えO(n)て、リストが最高から最悪の順になるようにしてほしいと思っています。笑:)
サム・イートン

4
2D配列のトラバースは、正方行列でない限り、実際にはO(nxm)です。
Simon Peck

1
「巡回セールスマン」問題はnの例です。(階乗なし)
Ju66ernaut 2017

28

簡単な例ではO(1)あるかもしれないreturn 23;-何でも入力、これは、固定された、有限の時間に戻ります。

の典型的な例はO(N log N)、優れたアルゴリズム(たとえば、mergesort)で入力配列をソートすることです。

O(log N)ソートされた入力配列の値を二分法で検索する場合の典型的な例です。


28

O(1)-ほとんどの調理手順はO(1)です。つまり、調理する人がもっと多くても、一定の時間がかかります(ポット/鍋のスペースが不足する可能性があるため、ある程度)そして料理を分割する必要があります)

O(logn)-電話帳で何かを見つけます。バイナリ検索を考えてください。

O(n)-本を読む。nはページ数です。本を読むのにかかる最小時間です。

O(nlogn)-マージまたはクイックソートを実行してカードをソートしない限り、nlognである毎日のようなことをすぐに考えることはできません。


2
ミニローストよりもローストの調理に時間がかかります:-)
paxdiablo 2009年

4
しかし、オーブンがそれに合うのに十分な大きさであれば、通常2つのミニローストと1つのミニローストを調理するのに同じ時間がかかります!
Chii

1
非常に洞察に満ちています!名前や番号のリストから電話やアドレス帳を編集する作業はO(n log n)かもしれません
squashed.bugaboo

10

いくつかの一般的なアルゴリズムを提供できます...

  • O(1):配列の要素へのアクセス(つまり、int i = a [9])
  • O(n log n):クイックまたはマージソート(平均)
  • O(log n):バイナリ検索

これは、宿題やインタビューのような質問のように聞こえるので、直感的な回答になります。より具体的なものを探している場合、一般の人は一般的なアプリケーションの基盤となる実装(もちろんオープンソースを節約する)を理解しておらず、一般的な概念は「アプリケーション」に適用されないため、少し難しくなります。


4

O(1):チェス(またはその点ではGo)で次の最善の動きを見つける。ゲームの状態数は有限なので、O(1)のみです:-)


5
はい、通常は時間とスペースをトレードオフできます。3 ^ 9の状態しかないため(回転をインテリジェントに処理しない限り)、三目並べゲームで実際にこれを実行しました。ただし、チェスにはやや多数の州があります:-)
paxdiablo 2009年

1
問題は、私がO(1)ナノ秒しか生きないということです、そしてあなたはきっとどちらO(1)が最初に起こるかを確かに知っています...
zardav

3

ソフトウェアアプリケーションの複雑さは測定されておらず、big-O表記法で記述されていません。アルゴリズムの複雑さを測定し、同じドメイン内のアルゴリズムを比較する場合にのみ役立ちます。おそらく、O(n)と言うときは、「O(n)比較」または「O(n)算術演算」であることを意味します。つまり、アルゴリズムまたはアプリケーションのペアを比較することはできません。


1
それは本当ではありません。アルゴリズムがO(N)時間の複雑さを持っている場合、それは、そのランタイムが、ある定数kに対してk * Nステップに制限されていることを意味します。「ステップ」がCPUサイクル、アセンブリ命令、または(単純な)C操作であるかどうかは、それほど重要ではありません。その詳細は定数kによって隠されています。
イゴールオストロフスキー09/10/20

言うまでもなく、多くの実際的なケースでは、O(logN)アルゴリズムの「c」は、単純なO(N)アルゴリズムよりも悪化します。
ゼッド

ハハ、はい、そしてNとは、チューリングマシンのテープへの入力の長さを意味します。これにより、垂直形式の除算を実行するのに指数関数的な時間がかかります。:-)各ドメインには、独自の要件と独自の抽象化領域があります。
P

3

O(1)-二重リンクリストからの要素の削除。例えば

typedef struct _node {
    struct _node *next;
    struct _node *prev;
    int data;
} node;


void delete(node **head, node *to_delete)
{
    .
    .
    .
}

2

次のアルゴリズムをリストに追加できます。

O(1)-数値が偶数か奇数かを判断する。HashMapの操作

O(logN) -x ^ Nの計算、

O(N Log N) -最も長く増加するサブシーケンス


1

O(n log n)は、有名なことですが、任意のセットをソートできる速さの上限です(高度で並列性のないコンピューティングモデルを想定しています)。


0

0(logn)-バイナリ検索、配列内のピーク要素(複数のピークが存在する場合があります)0(1)-リストまたは文字列の長さを計算するPython。len()関数は0(1)時間かかります。配列の要素へのアクセスには0(1)時間かかります。スタックでのプッシュ操作には0(1)時間かかります。0(nlogn)-マージソート。Pythonでの並べ替えには、nlogn時間かかります。したがって、listname.sort()を使用すると、nlogn時間がかかります。

注-ハッシュテーブルでの検索は、衝突が原因で、一定以上の時間がかかることがあります。


0

O(2 N

O(2 N)は、入力データセットへの各追加で成長が倍になるアルゴリズムを示します。O(2 N)関数の成長曲線は指数関数的です-非常に浅いところから始まり、その後気象的に上昇します。O(2 N)関数の例は、フィボナッチ数列の再帰的な計算です。

int Fibonacci (int number)
{
if (number <= 1) return number;
return Fibonacci(number - 2) + Fibonacci(number - 1);
}

Tower of Hanoiより良い例でしょう。
Ashish Duklan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.