この「O(1)アクセス時間」という用語が「すぐに」という意味で使用されているのを見てきましたが、その意味がわかりません。同じ文脈で私が見るもう1つの用語は、「O(n)アクセス時間」です。誰かがこれらの用語の意味を簡単な方法で説明してもらえますか?
こちらもご覧ください
この「O(1)アクセス時間」という用語が「すぐに」という意味で使用されているのを見てきましたが、その意味がわかりません。同じ文脈で私が見るもう1つの用語は、「O(n)アクセス時間」です。誰かがこれらの用語の意味を簡単な方法で説明してもらえますか?
こちらもご覧ください
回答:
あなたは複雑さの順序について読みたくなるでしょう。
http://en.wikipedia.org/wiki/Big_O_notation
要するに、O(1)は、セット内のデータの量に関係なく、14ナノ秒または3分のような一定の時間がかかることを意味します。
O(n)は、セットのサイズに比例して時間がかかることを意味します。したがって、サイズが2倍のセットは、2倍の時間がかかります。おそらく、これらの1つに100万のオブジェクトを入れたくないでしょう。
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }
is O(1)
です。
本質的に、コレクション内のアイテムの数が少ない場合でも、非常に多くの場合(ハードウェアの制約内)でも、コレクション内の値を検索するのと同じ時間がかかることを意味します
O(n)は、アイテムの検索にかかる時間は、コレクション内のアイテムの数に比例することを意味します。
これらの典型的な例は、サイズに関係なく直接アクセスできる配列と、特定のアイテムにアクセスするために最初から順番にトラバースする必要があるリンクリストです。
通常議論される他の操作は挿入です。コレクションは、アクセスの場合はO(1)、挿入の場合はO(n)にすることができます。実際、配列はまさにこの振る舞いをします、なぜならアイテムを真ん中に挿入するために、あなたはそれを次のスロットにコピーすることによって各アイテムを右に移動しなければならないでしょう。
現在この質問に回答しているすべての回答は、O(1)
平均時間が一定であることを示しています(測定に何が起こっても、実行時間、操作の数などである可能性があります)。これは正確ではありません。
ランタイムとO(1)
は、入力に関係なくc
、ランタイムがによって制限される定数があることを意味しc
ます。たとえば、n
整数の配列の最初の要素を返すと次のようになりますO(1)
。
int firstElement(int *a, int n) {
return a[0];
}
しかし、この関数もO(1)
そうです:
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
ここでの実行時間は1年以上に制限されていますが、ほとんどの場合、実行時間はナノ秒のオーダーです。
ランタイムとO(n)
はc
、ランタイムがによって制限されるような定数があることを意味します。c * n
ここn
で、入力のサイズを測定します。たとえばn
、次のアルゴリズムによって、整数の並べ替えられていない配列内の特定の整数の出現回数を検索すると、次のようになりますO(n)
。
int count(int *a, int n, int item) {
int c = 0;
for(int i = 0; i < n; i++) {
if(a[i] == item) c++;
}
return c;
}
これは、各要素を1つずつ検査して配列を反復処理する必要があるためです。
これはBig O表記と呼ばれ、さまざまなアルゴリズムの検索時間を表します。
O(1)は、最悪のケースの実行時間が一定であることを意味します。ほとんどの状況では、実際にコレクションを検索する必要がないことを意味します。探しているものをすぐに見つけることができます。
O(1)
データセットnに関係なく、常に同時に実行されます。O(1)の例は、インデックスを持つ要素にアクセスするArrayListです。
O(n)
線形次数とも呼ばれ、入力データのサイズに比例してパフォーマンスが直線的に向上します。O(n)の例は、ランダムな位置でのArrayListの挿入と削除です。ランダムな位置での後続の各挿入/削除により、線形配列を維持するために、ArrayListの要素がその内部配列の右にシフトするため、新しい配列の作成と古い要素からの要素のコピーについては言うまでもありません高価な処理時間を必要とする新しいアレイに変更すると、パフォーマンスが低下します。
基本的に、O(1)はその計算時間が一定であることを意味しますが、O(n)は入力のサイズに直線的に依存することを意味します。通常の数との最大値を計算しながら、アイテムのO(1)があります。
ウィキペディアも役立つかもしれません:http : //en.wikipedia.org/wiki/Computational_complexity_theory
O(1)とO(n)を区別する最も簡単な方法は、配列とリストを比較することです。
配列の場合、適切なインデックス値があれば、データにすぐにアクセスできます。(インデックスがわからず、配列をループする必要がある場合は、O(1)にはなりません)
リストの場合、インデックスがわかっているかどうかに関係なく、常にループする必要があります。
これは簡単な例えです。O(1)を使用してオンラインで映画をダウンロードするとします。1つの映画をダウンロードするのに5分かかる場合でも、20の映画をダウンロードするのに同じ時間がかかります。したがって、ダウンロードする映画の数は関係ありません。1本でも20本でも同じ時間(5分)かかります。この類推の通常の例は、1つの映画を撮っている場合でも5枚を撮っている場合でも、映画ライブラリーにアクセスするときです。したがって、同じ時間を費やしています。
ただし、O(n)の場合、1つの映画をダウンロードするのに5分かかる場合、10の映画をダウンロードするのに約50分かかります。したがって、時間は一定ではないか、ダウンロードする映画の数にある程度比例します。
アルゴリズムの概要:Cormen、Leiserson、Rivest&Steinによる第2版は44ページで次のように述べています
定数はすべて次数0の多項式なので、定数関数はTheta(n ^ 0)またはTheta(1)として表すことができます。ただし、この後者の表記は、どの変数が無限になりやすいかが明確でないため、軽微な誤用です。ある変数に関して定数または定数関数を意味するために、表記Theta(1)を使用することがよくあります。... O(g(n))...は、0 <= f(n)<= c * g(n)となる正の定数cおよびn0が存在するような関数のセットf(n)で表します。すべてのn> = n0。... f(n)= Theta(g(n))は、f(n)= O(g(n))を意味することに注意してください。これは、Theta表記がO表記よりも強いためです。
アルゴリズムがO(1)時間で実行される場合、これは漸近的に変数に依存しないことを意味します。つまり、1を掛けると、関数の漸近複雑度(〜ランタイム)よりも大きい正の定数が少なくとも1つ存在します。特定の量を超えるnの値の場合。技術的には、O(n ^ 0)時間です。
私の見解によれば、
O(1)は、最良の場合のアルゴリズムの時間複雑性分析で、一度に1つの操作または命令を実行する時間が1であることを意味します。