「O(1)アクセス時間」とはどういう意味ですか?


126

この「O(1)アクセス時間」という用語が「すぐに」という意味で使用されているのを見てきましたが、その意味がわかりません。同じ文脈で私が見​​るもう1つの用語は、「O(n)アクセス時間」です。誰かがこれらの用語の意味を簡単な方法で説明してもらえますか?

こちらもご覧ください


このかもしれないのヘルプ:stackoverflow.com/questions/471199/...
Mehrdad Afshari

回答:


161

あなたは複雑さの順序について読みたくなるでしょう。

http://en.wikipedia.org/wiki/Big_O_notation

要するに、O(1)は、セット内のデータの量に関係なく、14ナノ秒または3分のような一定の時間がかかることを意味します。

O(n)は、セットのサイズに比例して時間がかかることを意味します。したがって、サイズが2倍のセットは、2倍の時間がかかります。おそらく、これらの1つに100万のオブジェクトを入れたくないでしょう。


66
わかりやすくするために、ランタイム(または操作の数など)が一定であることを意味しません。これは、ランタイム(または操作の数など)が定数によって制限されるような定数があることを意味します。ランタイムには、まだ大きな差異がある可能性があります。たとえば、int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }is O(1)です。
Jason

素晴らしい洞察力@jason!
Chris Ruskai

35

本質的に、コレクション内のアイテムの数が少ない場合でも、非常に多くの場合(ハードウェアの制約内)でも、コレクション内の値を検索するのと同じ時間がかかることを意味します

O(n)は、アイテムの検索にかかる時間は、コレクション内のアイテムの数に比例することを意味します。

これらの典型的な例は、サイズに関係なく直接アクセスできる配列と、特定のアイテムにアクセスするために最初から順番にトラバースする必要があるリンクリストです。

通常議論される他の操作は挿入です。コレクションは、アクセスの場合はO(1)、挿入の場合はO(n)にすることができます。実際、配列はまさにこの振る舞いをします、なぜならアイテムを真ん中に挿入するために、あなたはそれを次のスロットにコピーすることによって各アイテムを右に移動しなければならないでしょう。


21

現在この質問に回答しているすべての回答は、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つずつ検査して配列を反復処理する必要があるためです。


19

O(1)は、何かにアクセスする時間がコレクション内のアイテムの数に依存しないことを意味します。

O(N)は、アイテムにアクセスする時間が、コレクション内のアイテムの数(N)に比例することを意味します。


14

O(1)は必ずしも「迅速に」を意味するわけではありません。これは、かかる時間は一定であり、関数への入力のサイズに基づいていないことを意味します。定数は速い場合も遅い場合もあります。O(n)は、関数の所要時間が、nで示される関数への入力のサイズに正比例して変化することを意味します。繰り返しになりますが、高速でも低速でもかまいませんが、nのサイズが大きくなるにつれて遅くなります。


9

これはBig O表記と呼ばれ、さまざまなアルゴリズムの検索時間を表します。

O(1)は、最悪のケースの実行時間が一定であることを意味します。ほとんどの状況では、実際にコレクションを検索する必要がないことを意味します。探しているものをすぐに見つけることができます。


「検索時間」を「最悪の場合の実行時間」に置き換えてください。
ジェイソンPunyon

2
@Seb:特にOPがアクセス時間について尋ねたので、それは彼の誤解でした。
jkeys 2009年

6

O(1)データセットnに関係なく、常に同時に実行されます。O(1)の例は、インデックスを持つ要素にアクセスするArrayListです。

O(n)線形次数とも呼ばれ、入力データのサイズに比例してパフォーマンスが直線的に向上します。O(n)の例は、ランダムな位置でのArrayListの挿入と削除です。ランダムな位置での後続の各挿入/削除により、線形配列を維持するために、ArrayListの要素がその内部配列の右にシフトするため、新しい配列の作成と古い要素からの要素のコピーについては言うまでもありません高価な処理時間を必要とする新しいアレイに変更すると、パフォーマンスが低下します。


4

「ビッグO表記」は、アルゴリズムの速度を表す方法です。nアルゴリズムが使用するデータの量です。O(1)つまり、データ量に関係なく、一定の時間で実行されます。O(n)データ量に比例することを意味します。


3

基本的に、O(1)はその計算時間が一定であることを意味しますが、O(n)は入力のサイズに直線的に依存することを意味します。通常の数との最大値を計算しながら、アイテムのO(1)があります。

ウィキペディアも役立つかもしれません:http : //en.wikipedia.org/wiki/Computational_complexity_theory


3

O(1)とO(n)を区別する最も簡単な方法は、配列とリストを比較することです。

配列の場合、適切なインデックス値があれば、データにすぐにアクセスできます。(インデックスがわからず、配列をループする必要がある場合は、O(1)にはなりません)

リストの場合、インデックスがわかっているかどうかに関係なく、常にループする必要があります。


私はO(1)の例を探していましたが、この答えだけに説明があります。
neelmeg 2016年

3

これは簡単な例えです。O(1)を使用してオンラインで映画をダウンロードするとします。1つの映画をダウンロードするのに5分かかる場合でも、20の映画をダウンロードするのに同じ時間がかかります。したがって、ダウンロードする映画の数は関係ありません。1本でも20本でも同じ時間(5分)かかります。この類推の通常の例は、1つの映画を撮っている場合でも5枚を撮っている場合でも、映画ライブラリーにアクセスするときです。したがって、同じ時間を費やしています。

ただし、O(n)の場合、1つの映画をダウンロードするのに5分かかる場合、10の映画をダウンロードするのに約50分かかります。したがって、時間は一定ではないか、ダウンロードする映画の数にある程度比例します。


1

これは、アクセス時間が一定であることを意味します。100レコードからアクセスしても100,000レコードからアクセスしても、取得時間は同じです。

対照的に、O(n)アクセス時間は、取得時間がアクセス元のレコード数に正比例することを示します。


1

これは、アクセスに一定の時間がかかる、つまりデータセットのサイズに依存しないことを意味します。O(n)は、アクセスがデータセットのサイズに線形に依存することを意味します。

Oはbig-Oとも呼ばれます。


1

アルゴリズムの概要: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)時間です。


-2

O(1)はランダムアクセスを意味します。任意のランダムアクセスメモリでは、任意の場所の任意の要素にアクセスするのにかかる時間は同じです。ここで、時間は任意の整数にすることができますが、覚えておくべき唯一のことは、(n-1)番目またはn番目の位置で要素を取得するのにかかる時間は同じ(つまり定数)であることです。

一方、O(n)はnのサイズに依存します。


ランダムアクセスとは何の関係もありません。詳細については、この回答のほぼ1年前に投稿された承認済みの回答を参照してください
Krease

-3

私の見解によれば、

O(1)は、最良の場合のアルゴリズムの時間複雑性分析で、一度に1つの操作または命令を実行する時間が1であることを意味します。


6
もっと頑張ってください。その特定の質問には、視点だけでなく明確な定義も必要です。
アルファブラボ2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.