Herhangi bir O (1 / n) algoritması var mı?


335

Herhangi bir O (1 / n) algoritması var mı?

Veya O (1) 'den daha düşük bir şey?


Soruların çoğu "O (1 / n) zaman karmaşıklığına sahip herhangi bir algoritma var mı?" Durumun böyle olduğunu varsayalım mı? Big-O (ve Big-Theta vb.) Algoritmaları değil işlevleri açıklar. (Fonksiyonlar ve algoritmalar arasında bir eşdeğerlik olmadığını biliyorum.)
jyoungdev

4
Bilgisayar bilimlerinde yaygın olarak anlaşılan "O (X) algoritması" tanımıdır: zaman karmaşıklığı O (X) olan bir algoritma (bazı ifade X için).
David Z

2
Benffer Tree kullanarak I / O verimli öncelik kuyruk algoritması durumunda böyle bir bağ duydum. Bir Tampon Ağacında, her işlem O (1 / B) I / O'larını alır; burada B blok boyutudur. Ve n operasyonları için toplam I / O'lar O (n / B.log (baz M / B) (n / B)) 'dir; burada log kısmı tampon ağacının yüksekliğidir.
CODError

O (1 / n) hata olasılığı olan birçok algoritma vardır. Örneğin, O (n log n) kovalara sahip bir çiçek filtresi.
Thomas Ahle

Tavuk ekleyerek daha hızlı yumurta bırakamazsınız.
Wyck

Yanıtlar:


310

Bu soru göründüğü kadar aptal değil. En azından teorik olarak , Büyük O gösteriminin matematiksel tanımını aldığımızda O (1 / n ) gibi bir şey tamamen mantıklıdır :

Şimdi kolayca yerine g ( x ) 1 / x ... Yukarıdaki tanım hala bazı için de geçerlidir aşikardır f .

Asimptotik çalışma zamanı büyümesini tahmin etmek amacıyla, bu daha az uygulanabilir… anlamlı bir algoritma girdi büyüdükçe daha hızlı olamaz. Elbette, bunu gerçekleştirmek için rasgele bir algoritma oluşturabilirsiniz, örneğin aşağıdakiler:

def get_faster(list):
    how_long = (1 / len(list)) * 100000
    sleep(how_long)

Açıkçası, bu işlev giriş boyutu büyüdükçe daha az zaman harcar ... en azından donanım tarafından zorlanan bir sınıra kadar (sayıların hassasiyeti sleep, bekleyebilecek minimum süre, bağımsız değişkenleri işleme süresi vb.): Bu sınır daha sonra bir sabit alt sınır dolayısıyla aslında yukarıdaki fonksiyon hala çalışma zamanı O (1) 'e sahiptir.

Ama olan çalışma zamanı (kısmen en azından) azaltabilir aslında gerçek dünya algoritmaları giriş boyutu artar. Bu algoritmalar olacağı Not olup aşağıdaki çalışma zamanı davranış sergileyen O da, (1). Yine de ilginçler. Örneğin, Horspool'un çok basit metin arama algoritmasını ele alalım . Burada, arama modelinin uzunluğu arttıkça beklenen çalışma süresi azalacaktır (ancak samanlığın artan uzunluğu çalışma süresini bir kez daha artıracaktır).


22
'Donanım tarafından zorlanan' bir Turing Makinesi için de geçerlidir. O (1 / n) durumunda, algoritmanın herhangi bir işlem yürütmesi beklenmeyen bir giriş boyutu her zaman olacaktır. Bu nedenle O (1 / n) zaman karmaşıklığının gerçekten imkansız olduğunu düşünürüm.
Roland Ewald

28
Mehrdad, anlamıyorsun. O notasyonu n -> ∞ gibi limitle (teknik olarak lim sup) ilgili bir şeydir . Bir algoritmanın / programın çalışma süresi, bazı makinedeki adımların sayısıdır ve bu nedenle ayrıktır - bir algoritmanın alabileceği zaman üzerinde sıfır olmayan bir alt sınır vardır ("bir adım"). Olduğu kadar mümkün bir sonlu K bir program n azalan bir dizi adım alır, ancak tek yol, bir algoritma yeterince her zaman 0 alırsa, bir ya da gerçekten de o o (1 / n) (1) olabilir büyük n - mümkün değil.
ShreevatsaR

28
O (1 / n) fonksiyonlarının (matematiksel anlamda) var olduğu konusunda aynı fikirde değiliz . Açıkçası öyle. Ancak hesaplama doğal olarak ayrıktır. Von Neumann mimarisinde veya tamamen soyut bir Turing makinesinde bir programın çalışma süresi gibi alt sınırı olan bir şey O (1 / n) olamaz . Aynı şekilde, O (1 / n) olan bir şeyin alt sınırı olamaz. ("Uyku" işleviniz çağrılmalıdır veya "liste" değişkeni incelenmelidir - veya giriş bandı bir Turing makinesinde incelenmelidir. Bu nedenle, geçen süre n ile bazı ε + 1 / n, O değil (1 / n))
ShreevatsaR

16
T (0) = ∞ ise durmaz. "T (0) = ∞ diye bir şey yoktur, ama yine de durur". Ayrıca, R∪ {∞} 'da çalışıp T (0) = ∞ ve T (n + 1) = T (n) / 2 tanımlasanız bile, tüm n için T (n) = ∞ tanımlayın. Tekrar edeyim: eğer ayrık değerli bir fonksiyon O (1 / n) ise, o zaman yeterince büyük n için 0 olur. [Prova: T (n) = O (1 / n) öyle bir sabit c olduğu anlamına gelir. n> N0, T (n) <c (1 / n) için, yani herhangi bir n> max (N0,1 / c) için T (n) <1, yani T (n) = 0 anlamına gelir.] Gerçek veya soyut hiçbir makine 0 zaman alamaz: girişe bakmak zorundadır . Asla hiçbir şey yapmayan ve tüm n için T (n) = 0 olan makinenin yanında.
ShreevatsaR

43
"Bu soru göründüğü kadar aptal değil" ile başlayan herhangi bir cevabı beğenmelisiniz.
Telemachus

138

Evet.

Çalışma zamanı O (1 / n) olan "boş" algoritma ile tam olarak bir algoritma vardır.

Bir algoritmanın O (1 / n) olması, tek bir komuttan oluşan algoritmadan daha az adımda asimptotik olarak yürütüldüğü anlamına gelir. Tüm n> n0 için bir adımdan daha az adımda yürütülürse, bu n için kesinlikle hiçbir talimat içermemelidir. 'N> n0' öğesinin kontrol edilmesi en az 1 talimat gerektirdiğinden, tüm n için talimat içermemelidir.

Özet olarak: O, (1 / n) sadece bir algoritma oluşan boş algoritmadır bir talimat.


2
Birisi boş bir algoritmanın zaman karmaşıklığının ne olduğunu sorarsa, O (1 / n) ile cevap verirsiniz ??? Bir şekilde bundan şüpheliyim.
phkahler

24
Bu konudaki tek doğru cevap budur ve (oylarıma rağmen) sıfır oydadır. Bu, "doğru görünümlü" yanıtların gerçekte doğru olanlardan daha yüksek oy verildiği StackOverflow'dur.
ShreevatsaR

5
Hayır, yanlış olduğu için 0 olarak derecelendirildi. N'den bağımsız olduğunda N ile ilişkili olarak büyük bir Oh değerini ifade etmek yanlıştır. İkincisi, herhangi bir programın, var olan bir programın bile çalıştırılması en az sabit bir zaman alır, O (1). Durum böyle olmasa bile, O (1 / n) değil O (0) olurdu.
kenj0418

32
O (0) olan herhangi bir işlev de O (1 / n) ve ayrıca O (n), ayrıca O (n ^ 2), ayrıca O (2 ^ n) 'dir. Ah, kimse basit tanımları anlamıyor mu? O () bir üst sınırdır.
ShreevatsaR

16
@ kenj0418 Her cümlede yanlış olmayı başardın. "N'den bağımsız olduğunda N ile ilgili büyük bir Oh değerini ifade etmek yanlıştır." Sabit bir fonksiyon mükemmel bir aptallık fonksiyonudur. "İkincisi, herhangi bir programı çalıştırmak, var olan bir programı bile en az sabit bir zaman alır, O (1)." Karmaşıklığın tanımı, gerçekte herhangi bir programı çalıştırmakla ilgili bir şey söylemez. "O (0) olurdu, O (1 / n) değil". @ ShreevatsaR'ın yorumuna bakınız.
Alexey Romanov

25

keskin dişler doğrudur, O (1) mümkün olan en iyi performanstır. Bununla birlikte, hızlı bir çözüm değil, sadece sabit bir zaman çözümü anlamına gelir.

İlginç bir varyant ve belki de gerçekten önerilen şey , nüfus büyüdükçe sorunların daha kolay hale gelmesidir. Ben düşünülmüş olsa da, yan yana dil 1 cevap düşünebilirsiniz:

Sette iki kişinin aynı doğum günü var mı? N 365'i aştığında true değerini döndürün. 365'den az olmasına rağmen, bu O (n ln n) 'dir. Belki de büyük bir cevap değil, çünkü sorun yavaş yavaş kolaylaşmıyor, ancak n> 365 için O (1) oluyor.


7
366. Artık yılları unutmayın!
Nick Johnson

1
Haklısın. Bilgisayarlar gibi ben de zaman zaman yuvarlama hatalarına maruz kalıyorum :-)
Adrian

10
+1. N arttıkça bir "faz geçişi" geçiren bir dizi NP-tam problemi vardır, yani n'nin belirli bir eşik değerini aştıkça çok daha kolay veya daha zor hale gelirler. Bir örnek, Sayı Bölümleme Sorunu'dur: bir takım n negatif olmayan tamsayı verildiğinde, bunları iki parçaya bölün, böylece her parçanın toplamı eşit olur. Bu, n'nin belirli bir eşik değerinde önemli ölçüde kolaylaşır.
j_random_hacker

23

Bu mümkün değil. Big-O'nun tanımı eşitsizlikten daha büyük değildir :

A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)

Dolayısıyla B (n) aslında maksimum değerdir, bu nedenle n arttıkça azalırsa tahmin değişmez.


42
Bu cevabın "doğru" olduğundan şüpheleniyorum, ancak maalesef bunu anlayabilecek zekâya sahip değilim.
freespace

12
AFAIK bu durumun tüm n için değil, tüm n> n_0 için geçerli olması gerekmez (yani, yalnızca girişin boyutu belirli bir eşiğe ulaştığında).
Roland Ewald,

30
Tanımın (düzeltilmiş bile) OP sorunuyla nasıl çeliştiğini görmüyorum. Tanım tamamen keyfi işlevler için geçerlidir! 1 / n, B için tamamen mantıklı bir fonksiyondur ve aslında denkleminiz bununla çelişmez (sadece matematik yapın). Yani hayır, çok fikir birliğine rağmen, bu cevap aslında yanlış . Afedersiniz.
Konrad Rudolph

10
Yanlış! Aşağı oylamayı sevmiyorum ama net bir fikir birliği olmadığında bunun imkansız olduğunu söylüyorsunuz. Pratikte haklısınız, eğer 1 / n çalışma zamanı (kolay) ile bir fonksiyon oluşturursanız, sonunda minimum süreyi vurur ve uygulandığında etkin bir şekilde O (1) algoritması yapar. Algoritmanın kağıt üzerinde O (1 / n) olmasını engelleyecek hiçbir şey yoktur.
jheriko

3
@Jason: Evet, şimdi söyledin ... :) @jheriko: O'nun (1 / n) zaman karmaşıklığı IMHO kağıdında çalışmaz. Bir Turing makinesi için f (girdi boyutu) = #ops büyüme fonksiyonunu karakterize ediyoruz. X adımından sonra n = 1 uzunluğunda bir giriş için durursa, n >> x giriş boyutunu seçeceğim, yani algoritma gerçekten O (1 / n) konumundaysa, hiçbir işlem yapılmamalıdır. yapılır. Bir Turing makinesi bunu nasıl fark etmelidir (kasetten bir kez okunmasına izin verilmez)?
Roland Ewald

16

Önceki büyük O gösterimi öğrenmemden, 1 adıma (bir değişkeni kontrol etmek, bir ödev yapmak gibi) ihtiyacınız olsa bile, O (1).

O (1) 'in O (6) ile aynı olduğunu unutmayın, çünkü "sabit" önemli değildir. Bu yüzden O (n) 'nin O (3n) ile aynı olduğunu söylüyoruz.

Yani 1 adıma bile ihtiyacınız varsa, bu O (1) ... ve programınız en az 1 adıma ihtiyaç duyduğundan, bir algoritmanın gidebileceği minimum değer O (1) 'dir. Yapmazsak, O (0), sanırım? Hiç bir şey yapmazsak, O (1) olur ve gidebileceği en düşük şey budur.

(Bunu yapmamayı seçersek, o zaman bir Zen veya Tao sorusu olabilir ... programlama alanında, O (1) hala minimumdur.

Ya da bunun hakkında:

programcı : patron, O (1) zamanında yapmak için bir yol buldum!
patron : Buna gerek yok, bu sabah iflas ediyoruz.
programcı : oh o zaman O (0) olur.



Sıfır basamaktan oluşan bir algoritma O (0) 'dır. Bu çok tembel bir algoritma.
nalply

8

Hayır, bu mümkün değil:

N, 1 / n cinsinden sonsuzluğa eğilimli olduğu için, sonunda etkili bir şekilde 0 olan 1 / (inf) elde ederiz.

Böylece, problemin büyük-oh sınıfı, büyük bir n ile O (0) olacaktır, ancak düşük bir n ile sabit zamana daha yakın olacaktır. Sabit zamandan daha hızlı bir şekilde yapılabilecek tek şey şu: Bu mantıklı değil:

void nothing() {};

Ve bu bile tartışmalı!

Bir komutu yürüttüğünüz anda, en az O (1) içerisindesiniz, yani hayır, büyük bir oh (O / 1) sınıfı olamaz!


7

Fonksiyonu hiç çalıştırmamaya ne dersiniz (NOOP)? veya sabit bir değer kullanarak. Bu sayılır mı?


16
Hala O (1) çalışma zamanı.
Konrad Rudolph

2
Tamam, bu hala O (1). Birinin bunu nasıl anlayabildiğini göremiyorum ve yine de başka bir cevapta NO-OP'den daha az bir şeyin mümkün olduğunu iddia ediyorum.
ShreevatsaR

4
ShreevatsaR: Kesinlikle bir çelişki yok. Büyük O gösteriminin işlevde harcanan zamanla hiçbir ilgisi olmadığını kavramış gibi görünmüyorsunuz - bunun yerine, zamanın girdiyi değiştirerek (belirli bir değerin üstünde) nasıl değiştiğini açıklıyor . Daha fazla bilgi için diğer yorum dizisine bakın.
Konrad Rudolph

Çok iyi anladım, teşekkürler. Nokta - diğer iş parçacığında birkaç kez yaptığım gibi - zaman girdi ile azalırsa, O (1 / n) oranında, o zaman sonunda NOOP tarafından alınan sürenin altına düşmesi gerektiğidir. Bu, hiçbir algoritmanın asemptotik olarak O (1 / n) olamayacağını gösterir, ancak kesinlikle çalışma süresi bir sınıra kadar düşebilir.
ShreevatsaR

1
Evet ... başka bir yerde söylediğim gibi, O (1 / n) olan herhangi bir algoritma da tüm girişler için sıfır zaman almalıdır, bu nedenle boş algoritmanın 0 zaman alıp almadığını düşünmenize bağlı olarak, bir O (1 / n) algoritması. Yani eğer dikkate NOOP O (1) olmak üzere, daha sonra (1 / n) algoritmalar hiçbir Ç vardır.
ShreevatsaR

7

Girişler büyüdükçe küçülen olasılıkları tanımlamak için genellikle O (1 / n) kullanıyorum - örneğin, log2 (n) döndürmelerde adil bir paranın kuyruk bulma olasılığı O (1 / n).


6
Bu büyük O değil. Soruyu cevaplamak için onu yeniden tanımlayamazsınız.
Zifre

11
Bu bir yeniden tanımlama değil, tam olarak büyük O'nun tanımı.
ShreevatsaR

10
Ben ticaretle teorik bir bilgisayar bilimciyim. Bir fonksiyonun asimptotik sırası ile ilgilidir.
Dave

4
Big O, keyfi bir fonksiyonun özelliğidir. Zaman karmaşıklığı olası uygulamalarından sadece bir tanesidir. Alan karmaşıklığı (bir algoritmanın kullandığı çalışma belleği miktarı) başka bir şeydir. Sorunun O (1 / n) algoritmalarıyla ilgili olması, bunlardan biri olduğunu ima ediyor (bilmediğim algoritmalar için geçerli başka bir tane yoksa). Diğer uygulamalar arasında nüfus artışının emirleri vardır, örneğin Conway'in Hayatı. Ayrıca bkz. En.wikipedia.org/wiki/Big_O_notation
Stewart

5
@Dave: Soru, açıkça var olan O (1 / n) fonksiyonlarının olup olmadığı değildi. Daha ziyade, (null işlevinin olası istisnası hariç) var
olamayan

6

O (1) basitçe "sabit zaman" anlamına gelir.

Bir döngüye [1] erken bir çıkış eklediğinizde (büyük O gösteriminde) bir O (1) algoritmasını O (n) 'ye dönüştürürsünüz, ancak daha hızlı hale getirirsiniz.

Hile genel olarak sabit zaman algoritması en iyisidir ve lineer üstelden daha iyidir, ancak küçük miktarlarda n için üstel algoritma aslında daha hızlı olabilir.

1: Bu örnek için statik bir liste uzunluğu olduğu varsayılarak


6

Bu soruyu okuyan ve konuşmanın ne hakkında olduğunu anlamak isteyen herkes için bu yardımcı olabilir:

|    |constant |logarithmic |linear|  N-log-N |quadratic|  cubic  |  exponential  |
|  n |  O(1)   | O(log n)   | O(n) |O(n log n)|  O(n^2) |  O(n^3) |     O(2^n)    |
|  1 |       1 |          1 |     1|         1|        1|       1 |             2 |
|  2 |       1 |          1 |     2|         2|        4|       8 |             4 |
|  4 |       1 |          2 |     4|         8|       16|      64 |            16 |
|  8 |       1 |          3 |     8|        24|       64|     512 |           256 |
| 16 |       1 |          4 |    16|        64|      256|   4,096 |         65536 |
| 32 |       1 |          5 |    32|       160|    1,024|  32,768 | 4,294,967,296 |
| 64 |       1 |          6 |    64|       384|    4,069| 262,144 |   1.8 x 10^19 |

5

Kuantum algoritmalarının süperpozisyonla "bir kerede" birden fazla hesaplama yapabileceğine inanıyorum ...

Bunun yararlı bir cevap olduğundan şüpheliyim.


Hala sabit zaman olacaktır, yani, O (1), bu boyut verileri için çalıştırmak için zaman aynı miktarda alır anlamı n bu boyut 1. veri olduğu gibi
freespace

2
Peki ya sorun soluk bir gaziyse? (ah. hah. ha.)
Jeff Meatball Yang

7
Bu, içinde olmak için süper bir konum olurdu.
Daniel Earwicker,

1
Kuantum algoritmaları birden fazla hesaplama yapabilir, ancak yalnızca bir hesaplamanın sonucunu alabilirsiniz ve hangi sonucu alacağınızı seçemezsiniz. Neyse ki, bir bütün olarak bir kuantum kaydı üzerinde işlemler yapabilirsiniz (örneğin, QFT), böylece bir şey bulmaktan çok hoşlanıyorsunuz :)
Gracenotes

2
belki de yararlı değildir, ancak gerçek olma avantajına sahiptir, bu da onu daha yüksek oy alan cevapların bazılarının üstüne koyar B-)
Brian Postow

4

birçok kişi doğru cevaba sahipti (Hayır) Bunu kanıtlamanın başka bir yolu var: Bir fonksiyona sahip olmak için, fonksiyonu çağırmanız gerekir ve bir cevap vermeniz gerekir. Bu sabit bir süre alır. İŞLEMİN geri kalan kısmı daha büyük girdiler için daha az zaman aldıysa, yanıtı yazdırmak (yani tek bir bit olduğunu varsayabiliriz) en az sabit zaman alır.


2

Çözelti mevcutsa, sabit zamanda = hemen hazırlanabilir ve erişilebilir. Örneğin, sıralama sorgusunun ters sırada olduğunu biliyorsanız bir LIFO veri yapısı kullanmak. Ardından, uygun modelin (LIFO) seçildiği göz önüne alındığında, veriler zaten sıralanmıştır.


2

Nüfus arttıkça hangi sorunlar daha kolaylaşır? Bir cevap, indirme hızının düğüm sayısının ters bir işlevi olduğu bittorrent gibi bir şeydir. Ne kadar çok yüklerseniz onu yavaşlatan bir arabanın aksine, bittorrent gibi bir dosya paylaşım ağı o kadar fazla düğümü bağlar.


Evet, ancak bittorrent düğümlerinin sayısı daha çok paralel bir bilgisayardaki işlemci sayısına benzer. Bu durumda "N", indirilmeye çalışılan dosyanın boyutu olacaktır. N bilgisayarınız varsa, N uzunluğunda sıralanmamış bir dizide bir öğeyi bulabildiğiniz gibi, N bilgisayarları size veri göndermeye çalışıyorsanız N Boyutu'ndaki bir dosyayı sabit zamanda indirebilirsiniz.
Kibbee

2

O (1) in altına inemezsiniz, ancak k, N'den küçük olduğunda O (k) mümkündür. Onlara alt doğrusal zaman algoritmaları adını verdik . Bazı problemlerde, Alt Doğrusal zaman algoritması belirli bir soruna sadece yaklaşık çözümler verebilir. Bununla birlikte, bazen, muhtemelen veri kümesi çok büyük olduğu veya hepsini hesaplamak için çok fazla hesaplama pahalı olduğu için yaklaşık çözümler iyi olur.


1
Anladığımdan emin değilim. Log (N) N'den küçük. Bu, Log (N) 'nin bir alt doğrusal algoritma olduğu anlamına mı geliyor? Ve birçok Log (N) algoritması var. Böyle bir örnek, ikili ağaçta bir değer bulmaktır. Bununla birlikte, bunlar hala 1 / N'den farklıdır, çünkü Log (N) her zaman artmaktadır, 1 / n azalan bir fonksiyondur.
Kibbee

Tanıma bakıldığında, alt doğrusal zaman algoritması, zamanı N boyutundan daha yavaş büyüyen herhangi bir algoritmadır. Bu, Log (N) olan logaritmik zaman algoritmasını içerir.
Hao Wooi Lim

2
Uh, alt doğrusal zaman algoritmaları kesin yanıtlar verebilir, örneğin bir RAM makinesindeki sıralı bir dizide ikili arama.
A. Rex

@A. Rex: Hao Wooi Lim "Bazı problemlerde" dedi.
LarsH

1

Peki buna ne dersin:

void FindRandomInList(list l)
{
    while(1)
    {
        int rand = Random.next();
        if (l.contains(rand))
            return;
    }
}

listenin boyutu büyüdükçe, programın beklenen çalışma süresi azalır.


sanırım O (n) 'nin anlamını anlamıyorsun
Markus Lausberg

Liste ile değil, dizi veya karma ile nerede constainsO (1)
vava

Tamam, rastgele işlev tembel bir dizi olarak düşünülebilir, bu nedenle temel olarak "tembel rastgele listede" her öğeyi arar ve giriş listesinde bulunup bulunmadığını kontrol edersiniz. Bence bu doğrusaldan daha kötü , daha iyi değil.
hasen

İnt'in sınırlı değerlere sahip olduğunu fark ederseniz, bir anlamı var. Bu yüzden 2 <sup> 64 </sup> değeri içerdiğinde, bu anlık olacaktır. Bu zaten O (1) daha kötü yapar :)
vava

1

O (1 / n), O (1) 'den daha az değildir, temelde daha fazla veriye sahip olduğunuzda, algoritmanın daha hızlı gittiği anlamına gelir. Bir dizi aldığınızı ve ondan daha azına sahipse her zaman 10 100 öğeye kadar doldurduğunu ve daha fazlası varsa hiçbir şey yapmadığını varsayalım. Bu elbette O (1 / n) değil, O (-n) gibi bir şey :) Çok kötü O-büyük gösterim negatif değerlere izin vermiyor.


1
"O (1 / n), O (1) 'den daha az değildir" - f işlevi O (1 / n) ise, aynı zamanda O (1)' dir. Ve büyük-oh bir "küçüktür" ilişkisine çok benzer: refleksiftir, geçişlidir ve f ve g arasında simetri varsa, ikisi eşdeğerdir, burada büyük teta bizim denklik ilişkimizdir. Yine de a = b ima etmek için <= b ve b <= a gerektiren ISTR "gerçek" sipariş ilişkileri ve netcraft ^ W wikipedia bunu doğrular. Yani bir anlamda, gerçekten O (1 / n) 'nin O (1)' den daha az olduğunu söylemek doğrudur.
Jonas Kölker

1

Belirtildiği gibi, null işlevinin olası istisnası dışında, O(1/n)0'a yaklaşmak zorunda kalacağı için hiçbir işlev olamaz .

Tabii ki, Konrad tarafından tanımlanan gibi O(1), en azından bir anlamda daha az olması gerektiği gibi görünen bazı algoritmalar var .

def get_faster(list):
    how_long = 1/len(list)
    sleep(how_long)

Bu algoritmaları araştırmak istiyorsanız, kendi asimtotik ölçümünüzü veya kendi zaman kavramınızı tanımlamanız gerekir. Örneğin, yukarıdaki algoritmada, bir dizi "serbest" işlemin belirli bir süre kullanılmasına izin verebilirim. Yukarıdaki algoritmada, uykuyu hariç her şeyin zamanını hariç tutarak t 'yi tanımlarsam, o zaman t' = 1 / n, yani O (1 / n). Asimptotik davranış önemsiz olduğu için muhtemelen daha iyi örnekler vardır. Aslında, eminim oradaki biri önemsiz olmayan sonuçlar veren duyular ortaya çıkarabilir.


1

Cevapların çoğu big-O'nun sadece bir algoritmanın çalışma süresi ile ilgili olduğunu yorumlar. Ancak sorudan bahsetmediği için, sayısal analizde big-O'nun diğer uygulamasından bahsetmeye değer olduğunu düşündüm, bu da hata ile ilgilidir.

Adım boyutu (h) veya bölüm sayısı (n) hakkında konuşup konuşmamanıza bağlı olarak, birçok algoritma O (h ^ p) veya O (n ^ {- p}) olabilir. Örneğin, Euler yönteminde , y (0) ve dy / dx'i (y türevi) bildiğiniz göz önüne alındığında, bir y (h) tahmini ararsınız. Y (h) tahmininiz h, 0'a yaklaştıkça daha doğrudur. Bu nedenle, bazı rastgele x için y (x) bulmak için 0 ila x aralığını alır, n parçaya kadar böler ve Euler yöntemini çalıştırır her noktada, y (0) 'dan y (x / n)' ye y (2x / n) 'ye, vb. gitmek için.

Dolayısıyla Euler yöntemi O (h) veya O (1 / n) algoritmasıdır, burada h tipik olarak bir adım boyutu olarak yorumlanır ve n bir aralığı bölme sayısı olarak yorumlanır.

Kayan nokta yuvarlama hataları nedeniyle gerçek sayısal analiz uygulamalarında O (1 / sa) da olabilir . Aralığınızı ne kadar küçük yaparsanız, belirli algoritmaların uygulanması için daha fazla iptal, daha fazla önemli basamak kaybı ve dolayısıyla algoritma yoluyla yayılan daha fazla hata oluşur.

Euler yöntemi için, kayan noktalar kullanıyorsanız, yeterince küçük bir adım ve iptal kullanın ve büyük bir sayıya küçük bir sayı ekleyerek büyük sayıyı değiştirmeyin. İki çok yakın konumda değerlendirilen bir fonksiyondan iki sayıyı birbirinden çıkararak türevi hesaplayan algoritmalar için, y '(x)' i (y (x + h) - y (x) / h) ile pürüzsüz fonksiyonlarda y (x + h) y'ye (x) yaklaşır, bu da büyük iptal ve daha az önemli rakamlara sahip türev için bir tahmin sağlar. Bu da türev için ihtiyaç duyduğunuz algoritmaya (örneğin bir sınır değer problemi) yayılacaktır.


0

Tamam, biraz düşünmüştüm ve belki de bu genel formu takip edebilecek bir algoritma var:

1000 düğümlü bir grafik için seyahat eden satıcı problemini hesaplamanız gerekir, ancak ziyaret edemeyeceğiniz düğümlerin bir listesi de verilir. İstenmeyen düğümlerin listesi büyüdükçe, sorunun çözülmesi daha kolay hale gelir.


4
O zaman O (n) 'de farklı bir n. Bu hile ile her algoritmanın O (q) olduğunu söyleyebiliriz; burada q, örneğin Çin'de yaşayan insan sayısıdır.
vava

2
Boyer-Moore benzer bir tür (O (n / m)), ama bu gerçekten "O (1) 'den daha iyi" değil, çünkü n> = m. Bence aynı şey, "istenmeyen TSP" için de geçerli.
Niki

Bu durumda bile TSP'nin çalışma süresi NP-Complete'tir, sadece düğümleri grafikten kaldırırsınız ve bu nedenle n'yi etkili bir şekilde azaltırsınız.
Ed James

0

Kuşkusuz bir üst sınır O (1 / n) olan bir algoritma görüyorum:

Rutin dışında bir şey nedeniyle değişen büyük bir dizi girdiniz var (belki donanımı yansıtıyorlar veya hatta işlemcide bunu yapan başka bir çekirdek bile olabilirler) ve rastgele ama geçerli bir tane seçmelisiniz.

Şimdi, eğer değişmemiş olsaydı, öğelerin bir listesini yaparsınız, rastgele birini seçer ve O (1) zamanı alırsınız. Ancak, verilerin dinamik doğası bir liste yapmayı engeller, sadece rastgele prob yapmanız ve probun geçerliliğini test etmeniz gerekir. (Ve doğası gereği cevabın geri döndüğünde hala geçerli olduğuna dair bir garanti olmadığına dikkat edin. Bu, hala oyundaki bir birimin yapay zekâsı için de kullanılabilirdi. tetiği çekmek.)

Bu, en kötü durum sonsuzluk performansına sahiptir, ancak veri alanı doldukça azalan ortalama bir durum performansına sahiptir.


0

Sayısal analizde, yaklaşım algoritmalarının yaklaşık toleransta alt-sabit asimptotik karmaşıklığa sahip olması gerekir.

class Function
{
    public double[] ApproximateSolution(double tolerance)
    {
        // if this isn't sub-constant on the parameter, it's rather useless
    }
}

gerçekten alt sabit mi yoksa alt doğrusal mı demek istiyorsun? Yaklaşık algoritmalar neden alt sabit olmalıdır? Ve bu ne anlama geliyor?
LarsH

@LarsH, yaklaşık algoritma hatası adım boyutu (veya pozitif gücü) ile orantılıdır, bu nedenle adım boyutunuz ne kadar küçük olursa hata o kadar küçük olur. Ancak bir yaklaşım problemini incelemenin yaygın bir başka yolu, bir aralığın kaç kez bölündüğüne kıyasla hatadır. Bir aralığın bölüm sayısı adım boyutu ile ters orantılıdır, bu nedenle hata, bölüm sayısının pozitif gücüyle ters orantılıdır - bölüm sayısını artırdıkça hatanız azalır.
Andrew Lei

@AndrewLei: Vay, neredeyse 7 yıl sonra bir cevap! Sam'in cevabını şimdi ondan daha iyi anlıyorum. Yanıt verdiğiniz için teşekkürler.
LarsH

0

Sanırım O (1) 'den daha az mümkün değil. Algo tarafından alınan her zaman O (1) olarak adlandırılır. Ancak O (1 / n) için aşağıdaki fonksiyona ne dersiniz. (Bu çözümde halihazırda sunulan birçok varyant olduğunu biliyorum, ama sanırım hepsinin bazı kusurları var (büyük değil, konsepti iyi açıklıyorlar). İşte bir tane, sadece tartışma uğruna:

def 1_by_n(n, C = 10):   #n could be float. C could be any positive number
  if n <= 0.0:           #If input is actually 0, infinite loop.
    while True:
      sleep(1)           #or pass
    return               #This line is not needed and is unreachable
  delta = 0.0001
  itr = delta
  while delta < C/n:
    itr += delta

Böylece n arttıkça fonksiyon daha az zaman alacaktır. Ayrıca giriş gerçekten 0 ise, fonksiyonun geri dönmesi sonsuza kadar sürecektir.

Makinenin hassasiyeti ile sınırlandırılacağı iddia edilebilir. böylece iç mekanın üst sınırı vardır O (1). Ancak bunu, dizideki n ve C girişlerini alarak atlayabiliriz. Ve toplama ve karşılaştırma string üzerinde yapılır. Fikir şu ki, bununla n'yi keyfi olarak küçük azaltabiliriz. Bu nedenle, n = 0'ı görmezden gelsek bile, işlevin üst sınırı sınırlı değildir.

Ayrıca sadece çalışma süresinin O (1 / n) olduğunu söyleyemeyeceğimize inanıyorum. Ama O (1 + 1 / n) gibi bir şey söylemeliyiz


-1

O (1 / n) olan bir algoritma oluşturmak mümkün olabilir. Bir örnek, f (n) 'nin birkaç katını yineleyen bir döngü olacaktır; burada f (n), değerinin n'den büyük olacağı garanti edilen bir işlevdir ve n, sonsuzluğa yaklaştıkça f (n) -n sınırı sıfır. F (n) hesaplamasının da tüm n için sabit olması gerekir. Elimde f (n) neye benzeyeceğini veya böyle bir algoritmanın hangi uygulamaya sahip olacağını bilmiyorum, ancak bence böyle bir fonksiyon var olabilir, ancak ortaya çıkan algoritmanın bir algoritma olasılığını kanıtlamaktan başka bir amacı olmayacaktır. O (1 / n).


Döngününüz en az sabit zaman alan bir kontrol gerektirir, bu nedenle elde edilen algoritmanın en az karmaşıklığı O (1) vardır.
Stefan Reich

-1

Algoritmalar hakkında bilmiyorum ama rastgele algoritmalarda O (1) den daha az karmaşıklık görünüyor. Aslında o (1) (küçük o) O (1) 'den daha azdır. Bu tür karmaşıklık genellikle rastgele algoritmalarda görülür. Örneğin, dediğin gibi, bir olayın olasılığı 1 / n derece olduğunda, o (1) ile gösterirler. Veya yüksek olasılıkla bir şey olduğunu söylemek istediklerinde (örneğin 1 - 1 / n) bunu 1 - o (1) ile gösterirler.


-2

Giriş verilerinden bağımsız olarak cevap aynıysa, O (0) algoritmanız vardır.

ya da başka bir deyişle - girdi verileri gönderilmeden önce cevap biliniyor - fonksiyon optimize edilebilir - böylece O (0)


Gerçekten mi? Yine de bir değer döndürmeniz gerekir, bu yüzden hala O (1) olmaz mı?
Joachim Sauer

7
hayır, O (0) tüm girdilerin sıfır zaman aldığını gösterir. O (1) sabit zamandır.
Pete Kirkham

-2

Big-O gösterimi , bir algoritmanın tipik çalışma süresiyle aynı olmayan en kötü senaryoyu temsil eder . Bir O (1 / n) algoritmasının bir O (1) algoritması olduğunu kanıtlamak kolaydır. Tanım olarak,
O (1 / n) -> T (n) <= 1 / n, tüm n> = C> 0
O (1 / n) -> T (n) <= 1 / C, 1 / n <= 1 / C tüm n> = C
O (1 / n) -> O (1) içindir, çünkü Big-O gösterimi sabitleri yok sayar (yani C değeri önemli değildir)


Hayır: Büyük O gösterimi, ortalama ve beklenen zaman (ve hatta en iyi durum) senaryolarından bahsetmek için de kullanılır. Gerisi takip ediyor.
Konrad Rudolph

'O' notasyonu kesinlikle bir üst sınır tanımlar (algoritmik karmaşıklık açısından bu en kötü durum olacaktır). Omega ve Theta sırasıyla en iyi ve ortalama durumu belirtmek için kullanılır.
Roland Ewald

2
Roland: Bu bir yanlış anlama; üst sınır en kötü durumla aynı şey değildir, ikisi bağımsız kavramlardır. hashtable-containsAlgoritmanın O (1) olarak gösterilebilen beklenen (ve ortalama) çalışma zamanını düşünün - en kötü durum Theta (n) olarak çok kesin olarak verilebilir! Omega ve Theta sadece diğer sınırları belirtmek için kullanılabilir, ancak tekrar söylemek gerekirse : ortalama veya en iyi durumla ilgisi yoktur.
Konrad Rudolph

Konrad: Doğru. Yine de, Omega, Theata ve O genellikle sınırları ifade etmek için kullanılır ve tüm olası girdiler dikkate alınırsa , O üst sınırı vb. Temsil eder.
Roland Ewald

1
O (1 / n) 'nin O (1)' in bir alt kümesi olması önemsizdir ve doğrudan tanımdan sonra gelir. Aslında g fonksiyonu O (h) ise, O (g) olan herhangi bir fonksiyon f de O (h) olur.
Tobias

-2

Hiçbir şey O'dan küçük değildir (1) Big-O notasyonu bir algoritma için en büyük karmaşıklık sırasını ima eder

Bir algoritmanın çalışma zamanı n ^ 3 + n ^ 2 + n + 5 ise, O (n ^ 3) 'dir. Burada düşük güçler önemli değildir çünkü n -> Inf olarak, n ^ 2, n ^ 3

Aynı şekilde n -> Inf gibi, O (1 / n) O (1) ile ilgisiz olacaktır, bu nedenle 3 + O (1 / n) O (1) ile aynı olacaktır, böylece O (1) mümkün olan en küçük hesaplama yapar karmaşa


-2
inline void O0Algorithm() {}

1
Bu bir O (1) algoritmasıdır.
Lasse V. Karlsen

2
Bu da, ama mesele Ω (1) değil. Peki cevabım neden küçümsendi? Yanlış olduğumu düşünüyorsan açıklamaya ne dersin?
Stewart

Başka bir yerde, temelde, bu cevabın doğru olup olmadığını sordum ve tartışmalı görünüyor: stackoverflow.com/questions/3209139/…
jyoungdev

Satır içi, yani O (0) olarak düşünebilirsiniz. Ancak, tüm O (0) algoritmaları önemsizdir (hiçbir şey yapmaz), bu yüzden ... çok ilginç bir cevap değil.
Stefan Reich

@StefanReich Doğru, çok ilginç bir cevap değil, ama bir cevap.
Stewart

-2

İşte basit bir O (1 / n) algoritması. Ve hatta ilginç bir şey yapar!

function foo(list input) {
  int m;
  double output;

  m = (1/ input.size) * max_value;  
  output = 0;
  for (int i = 0; i < m; i++)
    output+= random(0,1);

  return output;
}

O (1 / n), artan girdi boyutu göz önüne alındığında bir fonksiyonun çıkışının nasıl değiştiğini açıkladığı için mümkündür. Bir fonksiyonun yürüttüğü talimat sayısını tanımlamak için 1 / n fonksiyonunu kullanırsak, fonksiyonun herhangi bir giriş boyutu için sıfır talimat almasına gerek yoktur. Daha ziyade, her bir giriş boyutu için, bir eşiğin üzerindeki n, gerekli talimat sayısının yukarıda 1 / n ile çarpılan pozitif bir sabitle sınırlandırılmasıdır. 1 / n'nin 0 olduğu ve sabitin pozitif olduğu gerçek bir sayı olmadığından, işlevin 0 veya daha az talimat almak için kısıtlanmasının bir nedeni yoktur.


1
O (1 / n) yatay çizginin = 1 altına düşeceğinden ve n sonsuzluğa ulaştığında, kodunuz yine de belirli sayıda adım yürütür, bu algoritma bir O (1) algoritmasıdır. Big-O notasyonu, algoritmanın tüm farklı bölümlerinin bir fonksiyonudur ve en büyüğünü alır. Yöntem her zaman talimatlardan bazılarını çalıştıracağından, n sonsuzluğa ulaştığında, her seferinde aynı talimatlar kalır ve böylece yöntem sabit zamanda çalışır. Elbette, çok zaman olmayacak, ancak bu Big-O notasyonu ile ilgili değil.
Lasse V. Karlsen
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.