web-dev-qa-db-ja.com

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

O(1)、O(n log n)、およびO(log n)の複雑さを持つ、毎日使用するアルゴリズムは何ですか?

98
Rachel

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

O(1)時間

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

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配列の走査
207
Karan Bajaj

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

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

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

28
Alex Martelli

O(1) - most cooking procedures are O(1), that is, it takes a constant amount of time even if there are more people to cook for (to a degree, because you could run out of space in your pot/pans and need to split up the cooking)

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

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

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

24
Chii

一般的なアルゴリズムを提供できます...

  • O(1): Accessing an element in an array (i.e. int i = a[9])
  • O(n log n): quick or mergesort (On average)
  • O(log n):バイナリ検索

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

10
Scanningcrew

O(1)-二重リンクリストから要素を削除します。例えば.

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


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

O(1): finding the best next move in Chess (or Go for that matter). As the number of game states is finite it's only O(1) :-)

3
Carsten

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

O(1)-数値が偶数か奇数かを判断します。 HashMapでの作業

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

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

2
rachvela

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

2
P Shved

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

1
Carsten

O(2N

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

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

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

注-ハッシュテーブルでの検索には、衝突のために一定の時間がかかる場合があります。

0
Abhinav Vajpeyi