"O (1) erişim süresi" ne anlama geliyor?


127

Bu "O (1) erişim süresi" teriminin "hızlı" anlamında kullanıldığını gördüm ama ne anlama geldiğini anlamıyorum. Onunla aynı bağlamda gördüğüm diğer terim "O (n) erişim süresi" dir. Birisi lütfen bu terimlerin ne anlama geldiğini basit bir şekilde açıklayabilir mi?

Ayrıca bakınız


Yanıtlar:


161

Karmaşıklık Düzeni hakkında okumak isteyeceksiniz.

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

Kısacası O (1), kümedeki veri miktarı ne olursa olsun, 14 nanosaniye gibi sabit bir süre veya üç dakika sürdüğü anlamına gelir.

O (n), setin boyutuyla doğrusal bir süre alacağı anlamına gelir, bu nedenle iki katı büyüklükteki bir set, iki kat zaman alır. Muhtemelen bunlardan birine bir milyon nesne koymak istemezsiniz.


66
Bilgiçlik taslamak, çalışma süresinin (veya işlem sayısının, vb.) Sabit olduğu anlamına gelmez. Bu, çalışma zamanının (veya işlem sayısının, vb.) Yukarıda sabit tarafından sınırlandığı bir sabit olduğu anlamına gelir. Hala çalışma zamanında büyük varyans olabilir: örneğin, int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }bir O(1).
jason

Harika fikir @jason!
Chris Ruskai

35

Özünde, koleksiyonunuzda az sayıda öğe olsun ya da çok fazla (donanımınızın kısıtlamaları dahilinde) koleksiyonunuzda bir değer aramak için aynı miktarda zaman aldığı anlamına gelir.

O (n), bir öğeyi aramak için gereken sürenin koleksiyondaki öğe sayısıyla orantılı olduğu anlamına gelir.

Bunların tipik örnekleri, boyutlarına bakılmaksızın doğrudan erişilebilen diziler ve belirli bir öğeye erişmek için baştan itibaren geçilmesi gereken bağlantılı listelerdir.

Genellikle tartışılan diğer işlem eklemedir. Bir koleksiyon erişim için O (1) ama ekleme için O (n) olabilir. Aslında bir dizi tam olarak bu davranışa sahiptir, çünkü ortaya bir öğe eklemek için, her öğeyi aşağıdaki yuvaya kopyalayarak sağa taşımanız gerekir.


21

Şu anda bu soruya yanıt veren her yanıt size, O(1)sabit zaman anlamına gelir (ölçüme ne olursa olsun; çalışma zamanı, işlem sayısı vb. Olabilir). Bu doğru değil.

Çalışma zamanının, girişten bağımsız olarak, çalışma zamanının yukarıda sınırlandırıldığı O(1)bir sabit olduğu anlamına gelir . Örneğin, bir tamsayı dizisinin ilk öğesini döndürmek şudur :ccnO(1)

int firstElement(int *a, int n) {
    return a[0];
}

Ancak bu işlev O(1)de:

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

Buradaki çalışma süresi yukarıda 1 yıl ile sınırlandırılmıştır, ancak çoğu zaman çalışma zamanı nanosaniye sırasındadır.

Çalışma zamanı olduğunu söylemek için O(n)sürekli bir olduğu anlamına gelir czamanı yukarıda sınırlanan bu şekilde c * n, burada nönlemler giriş boyutu. Örneğin, sıralanmamış bir tamsayı dizisindeki belirli bir tamsayının oluşum sayısını naşağıdaki algoritma ile bulmak 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;
}

Bunun nedeni, her bir öğeyi birer birer inceleyerek dizi boyunca yineleme yapmamız gerektiğidir.


19

O (1), bir şeye erişme süresinin koleksiyondaki öğe sayısından bağımsız olduğu anlamına gelir.

O (N), bir öğeye erişim süresinin koleksiyondaki öğelerin sayısı (N) ile orantılı olduğu anlamına gelir.


14

O (1) mutlaka "hızlı" anlamına gelmez. Bu, alacağı sürenin sabit olduğu ve işlev girdisinin boyutuna bağlı olmadığı anlamına gelir . Sabit hızlı veya yavaş olabilir. O (n), fonksiyonun aldığı sürenin, n ile gösterilen fonksiyon girdisinin boyutuyla doğru orantılı olarak değişeceği anlamına gelir. Yine, hızlı veya yavaş olabilir, ancak n'nin boyutu arttıkça yavaşlayacaktır.


9

Big O notasyonu olarak adlandırılır ve çeşitli algoritmalar için arama süresini tanımlar.

O (1), en kötü durum çalışma süresinin sabit olduğu anlamına gelir. Çoğu durumda bu, aslında koleksiyonu aramanıza gerek olmadığı anlamına gelir, aradığınızı hemen bulabilirsiniz.


"Arama süresini" "en kötü durum çalışma süresi" ile değiştirin, ben sizinle olurum.
Jason Punyon

2
@Seb: Bence bu, özellikle OP erişim süresini sorduğu için onun adına bir yanlış isim oldu.
jkeys

6

O(1)veri kümesinden bağımsız olarak her zaman aynı anda çalıştır n. O (1) 'e bir örnek, elemanına dizin ile erişen bir ArrayList olabilir.

O(n)Doğrusal Sıra olarak da bilinen performans doğrusal olarak ve giriş verilerinin boyutuyla doğru orantılı olarak büyüyecektir. O (n) 'nin bir örneği, rastgele konumda ArrayList ekleme ve silme olabilir. Rasgele konumdaki her bir sonraki ekleme / silme, ArrayList'teki öğelerin, doğrusal yapısını korumak için dahili dizisinin sağına sola kaymasına neden olacağından, yeni dizilerin oluşturulması ve eski öğelerin kopyalanmasından bahsetmeye gerek yok. pahalı işlem süresi alan yeni diziye, dolayısıyla performansa zarar verir.


4

"Büyük O notasyonu", algoritmaların hızını ifade etmenin bir yoludur. nalgoritmanın birlikte çalıştığı veri miktarıdır. O(1)ne kadar veri olursa olsun, sabit zamanda çalışacağı anlamına gelir. O(n)veri miktarı ile orantılı olduğu anlamına gelir.


3

Temel olarak, O (1) hesaplama süresinin sabit olduğu anlamına gelirken, O (n) girdi boyutuna doğrusal olarak bağlı olacağı anlamına gelir - yani bir dizi boyunca döngü O (n) içerir - sadece döngü - çünkü sayıya bağlıdır Sıradan sayılar arası maksimum hesaplanırken madde sayısı O (1) 'dir.

Wikipedia da yardımcı olabilir: http://en.wikipedia.org/wiki/Computational_complexity_theory


3

O (1) ve O (n) 'yi ayırt etmenin en kolay yolu dizi ve listeyi karşılaştırmaktır.

Dizi için doğru indeks değerine sahipseniz, verilere anında erişebilirsiniz. (Dizini bilmiyorsanız ve dizi boyunca döngü yapmanız gerekiyorsa, artık O (1) olmayacaktır)

Liste için, dizini bilseniz de bilmeseniz de her zaman üzerinde döngü yapmanız gerekir.


Bir O (1) örneği arıyordum ve sadece bu cevabın açıklaması var.
neelmeg

3

İşte basit bir benzetme; O (1) ile çevrimiçi film indirdiğinizi hayal edin, bir filmi indirmek 5 dakika sürüyorsa, 20 filmi indirmek yine de aynı zaman alacaktır. Yani kaç tane film indirdiğiniz önemli değil, bir veya 20 film olsun, aynı süre (5 dakika) sürecektir. Bu benzetmenin normal bir örneği, bir film kitaplığına gittiğinizde, ister bir film ister 5 film çekiyor olun, bunları bir kerede seçmenizdir. Dolayısıyla aynı zamanı harcamak.

Ancak, O (n) ile, bir filmin indirilmesi 5 dakika sürerse, 10 filmin indirilmesi yaklaşık 50 dakika sürecektir. Yani zaman sabit değildir veya indirdiğiniz filmlerin sayısıyla bir şekilde orantılıdır.


1

Erişim süresinin sabit olduğu anlamına gelir. 100 veya 100.000 kayıttan erişiyor olsanız da, geri alma süresi aynı olacaktır.

Buna karşılık, O (n) erişim süresi, erişim süresinin erişmekte olduğunuz kayıtların sayısıyla doğru orantılı olduğunu gösterir.


1

Bu, erişimin sabit zaman aldığı anlamına gelir, yani veri kümesinin boyutuna bağlı değildir. O (n), erişimin doğrusal olarak veri kümesinin boyutuna bağlı olacağı anlamına gelir.

O aynı zamanda big-O olarak da bilinir.


1

Algoritmalara Giriş: Cormen, Leiserson, Rivest & Stein tarafından hazırlanan İkinci Baskı sayfa 44'te şöyle diyor:

Herhangi bir sabit 0 derece polinom olduğu için, herhangi bir sabit fonksiyonu Theta (n ^ 0) veya Theta (1) olarak ifade edebiliriz. Bu ikinci gösterim küçük bir kötüye kullanımdır, çünkü hangi değişkenin sonsuzluğa meyilli olduğu açık değildir. Bazı değişkenlere göre sabit veya sabit bir fonksiyonu ifade etmek için sık sık Theta (1) gösterimini kullanacağız. ... 0 <= f (n) <= c * g (n) olacak şekilde pozitif sabitler c ve n0 olacak şekilde f (n) fonksiyonlarının kümesini O (g (n)) ile gösteriyoruz ... hepsi için n> = n0. ... F (n) = Teta (g (n)) 'nin f (n) = O (g (n)) anlamına geldiğine dikkat edin, çünkü Theta gösterimi O gösteriminden daha güçlüdür.

Bir algoritma O (1) zamanında çalışıyorsa, bu, asimptotik olarak herhangi bir değişkene bağlı olmadığı anlamına gelir, yani bir ile çarpıldığında, fonksiyonun asimptotik karmaşıklığından (~ çalışma zamanı) daha büyük olan en az bir pozitif sabit vardır. belirli bir miktarın üzerindeki n değerleri için. Teknik olarak, O (n ^ 0) zamanı.


-2

O (1), Rastgele Erişim anlamına gelir. Herhangi bir Rasgele Erişim Belleğinde, herhangi bir konumdaki herhangi bir öğeye erişmek için geçen süre aynıdır. Burada zaman herhangi bir tamsayı olabilir, ancak hatırlanması gereken tek şey, (n-1). Veya n. Konumdaki elemanı almak için geçen zamanın aynı olacağıdır (yani sabit).

O (n) ise n'nin boyutuna bağlıdır.


Bunun rastgele erişimle ilgisi yoktur - daha fazla bilgi için bu yanıttan neredeyse bir yıl önce yayınlanan kabul edilen yanıta bakın
Krease

-3

Benim bakış açıma göre,

O (1), en iyi durum için algoritmanın karmaşıklık analizinde bir seferde bir işlem veya talimat yürütme zamanı anlamına gelir.


6
Daha çok dene. Bu özel sorunun sadece bir perspektife değil, aynı zamanda açık bir tanıma ihtiyacı vardır.
Alfabravo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.