Aşağıdaki sınıfta çok iyi performans gösteren gerçek dünya algoritmaları var mı? [kapalı]


39

Dün gece başka bir programcı ile tartışıyordum, bir şey O (1) olsa bile, O (n) algoritmasında büyük bir sabit varsa, O (n) olan bir işlemden daha iyi bir performans sergileyebilirdi. Kabul etmedi, ben de buraya getirdim.

Altındaki sınıftakilerden çok daha iyi performans gösteren algoritma örnekleri var mı? Örneğin, O (n) O (1) 'den hızlı veya O (n 2 )' den O (n) 'dan daha hızlıdır.

Matematiksel olarak, sabit faktörleri göz ardı ettiğinizde asimptotik üst sınırlara sahip bir fonksiyon için gösterilebilir, ancak bu tür algoritmalar vahşi ortamda var mıdır? Peki bunlardan örnekleri nerede bulabilirim? Ne tür durumlar için kullanılır?


15
"Büyük" algoritmalar için bile, daha küçük mutlaka daha iyi değildir. Örneğin, gauss eleme O (n ^ 3) 'dür, ancak bunu O (n ^ 2)' de yapabilen algoritmalar vardır, ancak ikinci dereceden zaman algosunun katsayısı o kadar büyüktür ki, insanlar sadece O (n ^) ile gider. 3) bir.
BlackJack

11
Bunu "... gerçek dünyadaki sorunlar için" ya da bazılarını bunu mantıklı bir soru haline getirmek zorundasınız. Aksi takdirde, sadece nsabiti telafi etmek için yeterince büyük yapmanız gerekir (ki bu büyük O notalarının noktasıdır).
starblue

8
Hız için büyük O gösterimi almayın.
Codism

16
Büyük O yazımının amacı, bir algoritmanın ne kadar hızlı çalıştığını söylemek değil, ne kadar iyi ölçeklendiğini söylemek.
BlueRaja - Danny Pflughoeft

4
LP'yi çözmek için hiç kimse Simplex algoritmasından bahsetmediğine şaşırdım. Doğrusal beklenen çalışma süresi olan üstel bir en kötü duruma sahiptir. Uygulamada oldukça hızlı. En kötü durumdaki çalışma süresini de gösteren bir sorun inşa etmek önemsizdir. Ayrıca, yoğun olarak kullanılıyor.
ccoakley

Yanıtlar:


45

Çok küçük, sabit veri tablolarında aramalar. Optimize edilmiş bir karma tablo O (1) olabilir ve yine de karma hesaplamanın maliyeti nedeniyle ikili bir aramadan veya hatta doğrusal bir aramadan daha yavaş olabilir.


14
Daha kesin olarak, hashtable lookup (M), m'nin anahtarın büyüklüğü olduğu O (m) 'dir. Anahtar boyutu sabittir ise sadece O (1) diyebilirsiniz. Ayrıca, genellikle itfa edilir - aksi takdirde tablo büyüyemez / daralmaz. Üçlü ağaçlar genellikle dizelerin çok sık bulunamadığı bağlamlarda dize aramaları için karma tabloları geçebilir - üçlü ağaç araması genellikle dizenin ilk karakterini veya ikisini kontrol ederken hala anahtarın mevcut olmadığını keşfedecektir. Hashtable sürümü henüz karma hesaplamamıştır.
Steve314

2
Loren Pechtel'in cevabını ve Steve314'ün ilk yorumunu seviyorum. Aslında bunun olduğunu gördüm. Karma değerini döndürmek için çok uzun süren hashcode () yöntemine sahip bir Java sınıfı oluşturursanız (bunu önbelleğe alamaz / önleyemez), o zaman böyle bir sınıfın hash türü koleksiyonundaki örneklerini kullanarak HashSet), ALOT dizisini bir dizi türü koleksiyondan (ArrayList gibi) yavaşlatır.
Shivan Dragon

1
@ Steve314: neden hash işlevlerinin O (m) olduğunu varsayıyorsunuz ki, m anahtarın büyüklüğüdür? Karakter dizileri (veya diğer karmaşık türler) ile uğraşsanız bile karma fonksiyonlar O (1) olabilir. Girdi için yanlış bir veri yapısı (karma tablosu) seçilirse (anahtar boyutu tahmin edilemezse), karma işlevinin karmaşıklığı önemli ölçüde değiştirebileceğini basitçe tanımlamak için çok fazla bir değer yoktur.
Codism,

1
@ Steve314: Sabit veri tabloları dediğimi not edin. Büyümüyorlar. Ayrıca, çakışma olmadığından emin olmak için anahtarı optimize edebiliyorsanız, karma tablodan yalnızca O (1) performansını elde edersiniz.
Loren Pechtel

1
@Loren - kesinlikle, eğer masa sabit bir boyuta sahipse, boş bir alan aramak için harcayabileceğiniz maksimum bir süre vardır. Yani, en çok, n'nin sabit tablo boyutu olduğu n-1 önceden doldurulmuş yuvaları kontrol etmeniz gerekebilir. Yani sabit boyutlu bir hash tablosu gerçekten de O (1) 'dir, amortize edilmiş analize ihtiyaç duymadan. Bu, tablo doldukça erişimin yavaşlamasıyla ilgilenmediğiniz anlamına gelmez - yalnızca O'nun ifade ettiği şey değildir.
Steve314

25

Matris çarpımı. Naif O (n ^ 3) algoritması pratikte sıklıkla küçük-ish matrisleri için Strassen'in O'sundan (n ^ 2.8) daha hızlı kullanılır; Strassen ise daha büyük matrisler için O (n ^ 2.3) Coppersmith-Winograd algoritması yerine kullanılmıştır.



2
Coppersmith-Winograd ASLA kullanılmaz. Bunun uygulanması başlı başına korkunç bir iş olacak ve sürekli o kadar kötü ki modern bilimsel matris problemlerinde bile mümkün olmayacaktı.
tskuzzy

24

Basit bir örnek, çeşitli sıralama algoritmaları arasındaki farktır. Mergesort, Heapsort ve diğerleri O (n log n) . Quicksort, O (n ^ 2) en kötü durumudur. Ancak genellikle Quicksort daha hızlıdır ve aslında O (n log n) gibi ortalama bir performans sergiler . Daha fazla bilgi .

Başka bir örnek, tek bir Fibonacci sayısının üretilmesidir. Yinelemeli algoritma O (n) , matriks tabanlı algoritma ise O (log n) 'dir . Yine de, ilk bin Fibonacci sayısı için, yinelemeli algoritma muhtemelen daha hızlıdır. Bu aynı zamanda elbette uygulanmasına da bağlı!

Daha iyi bir asimptotik performansa sahip algoritmalar, daha kötü performansa sahip bir algoritma ile gerekli olmayan, ancak daha basit işlemlere sahip olan pahalı işlemleri içerebilir. Sonunda, O- notasyonu bize sadece üzerinde çalıştığı argüman önemli ölçüde arttığında (sonsuzluğa yaklaşır) performans hakkında bir şeyler söyler.


Bu, Big-O'nun harika bir açıklaması, ancak bir O (n) algoritmasının bir O (1) 'den daha hızlı olacağı özel durumlar için sorunun etini ele almıyor.
KyleWpppd

Fibonacci bir numara biraz kapalı. Girdi boyutunda çıktı boyutu üsteldir, bu yüzden O (lg n * e ^ n) ile O (lg lg n * e ^ n) arasındaki farktır.
Peter Taylor

Zeyilname: en iyi ihtimalle. Matris tabanlı algoritma, 1.5 ^ n sırasındaki sayılarla çarpma yapar, bu nedenle O (lg lg n * ne ^ n) elde edilebilir en iyi bağlı olabilir.
Peter Taylor

1
Quicksort normalde yine de O (n log n) beklenen performans olarak tanımlanır - en kötü durum rastgele girdiler için oldukça düşüktür ve bir ön proya veya pivot seçimine biraz rastgelelik getirmek, en kötü durumun genel olarak önemli girdi boyutları için çok düşük olduğu anlamına gelir. En kötü durum, quicksort'un (1) çok basit ve (2) çok önbellek dostu olması gerçeğinden daha az ilgilidir ve bu durum, her ikisi de diğer birçok sıralama algoritmasında olduğundan çok daha iyi sabit faktörlere yol açar.
Steve314

(2) tam da büyük O performansına bakarken göz önünde bulundurulması gereken dışsal değerlendirme türüdür. Algoritmik olarak Mergesort her zaman Quicksort'tan daha iyi performans göstermelidir, ancak kaynak kullanımı ve önbellek yeri genel olarak gerçek dünyadaki performans konumlarını tersine çevirir.
Dan Lyons

18

Not: Lütfen yorumları aşağıda @ back2dos ve diğer gurular tarafından okuyun, aslında yazdıklarımdan daha fazla yardımcı oluyorlar - Tüm katkıda bulunanlar için teşekkürler.

Aşağıdaki çizelgeden bence (alınan: Big O notasyonu , "Algoritmaların karamsar doğası:" için arama yapın), O (log n) 'in her zaman daha iyi olmadığını, O (n)' nin olduğunu görebilirsiniz. Öyleyse, argüman geçerli.

Pic-1


6
Soru özel gerçek dünyaya algoritma örnekleri istedi. Bu, haliyle hiçbir şekilde yok.
Megan Walker,

19
Bu grafikte hiçbir şey göremezsiniz, soruyu cevaplayacak. Yanıltıcıdır. Bu grafik sadece fonksiyonları y = 1, y = log xvb. Çizer y = 1ve y = xaslında kesişme noktasını oluşturur (1,1). Bu gerçekten doğru olsaydı, size söyleyeceğinden daha yüksek karmaşıklıktaki algoritmalar 0'dan 2'ye kadar daha hızlı olabilirdi ki bu, insanların zorlukla ilgileneceği bir şeydi. Grafiğin tamamen hesaba katmayı başaramadığı şey (ve söz konusu algılanabilir performans farkının ne ortaya çıktığı) sabit faktörlerdir.
back2dos

@Samuel Walker, yorumunuz için teşekkürler. Sağlanan bağlantı (Link-1), kategori başına bazı algoritma örneklerine sahiptir.
NoChance

5
@ back2dos: Tek başına grafik soruyu cevaplamıyor, ancak cevaplamak için kullanılabilir. Görüntülenen her işlevin şekli, herhangi bir ölçek ve sabit faktör için aynıdır. Bu grafikte, verilen fonksiyonların kombinasyonunun, birinin daha küçük olduğu ve diğerinin olduğu bir girdi aralığının olduğunu gösterir.
Jan Hudec

2
@ dan_waterworth, haklısın, o noktayı kabul edeceğim ve bu yorumu kaldıracağım. Bununla birlikte, cevap iki açıdan yanlış veya yanıltıcıdır: 1) Big-O'nun asıl amacı, karmaşıklığa üst sınır vermesidir; bu sadece büyük n için anlamlıdır, çünkü n büyüdükçe en büyük terim tarafından boğulmuş olan küçük terimleri açıkça ortaya koyarız. 2) Sorunun amacı, Big-O'ya yüksek olanın, daha düşük bir bağa sahip olandan daha iyi performans gösterdiği iki algoritma örneği bulmaktır. Bu cevap başarısız, çünkü böyle bir örnek vermedi.
Caleb

11

Pratik değerler için n, evet. CS teorisinde bu çok fazla ortaya çıkıyor. Genellikle teknik olarak daha iyi büyük Oh performansına sahip karmaşık bir algoritma vardır, ancak sabit faktörler pratik yapamayacak kadar büyüktür.

Bir zamanlar hesaplama geometrim profesörüm bir poligonu lineer zamanda üçgenleştirmek için bir algoritmayı tanımladı, ancak “çok karmaşık. Kimsenin gerçekten uyguladığını sanmıyorum” (!!) ile bitmişti.

Ayrıca, fibonacci yığınları normal yığınlardan daha iyi özelliklere sahiptir, ancak pratikte normal yığınlar kadar iyi performans göstermedikleri için popüler değildirler . Bu, yığın kullanan diğer algoritmalara göre basamaklanabilir - örneğin, Dijkstra'nın en kısa yolları bir fibonacci yığını ile matematiksel olarak daha hızlıdır, ancak pratikte değildir.


100.000 veya daha fazla köşeye sahip büyük grafikler için daha hızlı.
tskuzzy

Fibonacci yığınları benim de ilk (hatta ikinci) düşüncemdi.
Konrad Rudolph

10

Bağlantılı bir listeye ekleme ve yeniden boyutlandırılabilir bir diziye ekleme karşılaştırın.

Bağlantılı liste O (1) girişinin faydalı olması için veri miktarının oldukça büyük olması gerekir.

Bağlantılı bir listede, sonraki işaretçiler ve referanslar için fazladan ek yükü vardır. Yeniden boyutlandırılabilir bir dizinin etrafındaki verileri kopyalaması gerekir. Bu kopya O (n), ancak pratikte çok hızlı.


1
Her doldurulduğunda yeniden boyutlandırılabilir bir dizi iki katına çıkar, bu nedenle ekleme başına ortalama yeniden boyutlandırma maliyeti O (1) olur.
kevin cline

2
@kevincline, evet, ancak O (n), yerleştirme noktasından sonra tüm elemanları hareket ettirmek zorunda kalır. Tahsisat, O (1) defa itfa edilmektedir. Demek istediğim, hareketin hala çok hızlı olduğu, yani pratikte genellikle bağlantılı listeleri yener.
Winston Ewert

Bitişik dizilerin bağlantılı listelerle karşılaştırıldığında bu kadar hızlı olmasının nedeni işlemci önbelleklemesidir. Bağlantılı bir listeyi dolaşmak, her öğe için önbellek kaybına neden olur. Her iki dünyanın da en iyisini elde etmek için, kontrolsüz bir bağlantı listesi kullanmalısınız .
dan_waterworth

Yeniden boyutlandırılabilir diziler her zaman kopyalamaz. Neyin üzerinde çalıştığına ve yolunda bir şey olup olmadığına bağlı. İki kat daha büyük, uygulamaya özel. Bir şey üzerinde yuvarlanma bir sorun olsa da. Bağlantılı listeler genellikle bilinmeyen boyuttaki sıralar için en iyisidir, ancak döner arabellekleri sıraları paraları için çalıştırır. Diğer durumlarda, bağlantılı listeler kullanışlıdır, çünkü tahsisat veya genişleme her zaman bitişik öğelere sahip olmanıza izin vermeyeceğinden, zaten bir işaretçiye ihtiyacınız olacaktır.
jgmjgm

@jgmjgm, yeniden boyutlandırılabilir bir dizinin ortasına yerleştirirseniz, kesinlikle öğeleri bundan sonra kopyalar.
Winston Ewert

8

Big-Oh notasyonu bir fonksiyonun büyüme hızını tanımlamak için kullanılır, bu nedenle bir O (1) algoritmasının daha hızlı olması, ancak sadece belirli bir noktaya kadar (sabit faktör) olması mümkündür.

Ortak gösterimler:

O (1) - Yinelemelerin sayısı (bazen işlev tarafından harcanan kullanıcı zamanı olarak bahsedebilirsiniz) girişin boyutuna bağlı değildir ve gerçekte sabittir.

O (n) - Yinelemelerin sayısı girdi büyüklüğüyle doğrusal orantılı olarak artar . Anlamı - eğer algoritma herhangi bir N, 2 * N kez herhangi bir girişte yinelenirse, yine de O (n) olarak kabul edilir.

O (n ^ 2) (ikinci dereceden) - Yinelemelerin sayısı kare cinsinden girdi büyüklüğüdür.


2
Aksi halde mükemmel bir cevaba örnek eklemek için: bir O (1) yöntemi çağrı başına 37 yıl sürebilirken, bir O (n) yöntemi çağrı başına 16 x n mikrosaniye alabilir. Hangisi daha hızlı?
Kaz Ejderha

16
Bunun soruyu nasıl cevapladığını görmek konusunda tamamen başarısız oldum.
avakar

7
Büyük-O'yu anlıyorum. Bu, daha büyük big-O'lu algoritmaların daha yüksek big-O olanlara göre daha iyi performans gösterdiği fonksiyonların spesifik örnekleri olan asıl soruya değinmez.
KyleWpppd

Soruyu "Örnekler var mı ..." şeklinde verdiğinizde, birileri kaçınılmaz olarak "Evet" diye cevaplayacak. hiç vermeden.
rakslice

1
@rakslice: Belki öyle. Ancak bu site, yaptığınız tüm açıklamaların açıklamasını (veya daha iyisini ispatla) gerektirir. Şimdi, kanıtlamanın en iyi yolu, bu tür örnekler olduğunu
söylemektir

6

Regex kütüphaneleri genellikle karmaşıklığı olan DFA neslinden ziyade üstel zamana sahip olan geri izlemeyi yapmak için uygulanmaktadır O(nm).

Naif geri izleme, giriş hızlı yolda kaldığında veya aşırı geri izleme gerekmeden başarısız olduğunda daha iyi bir performans olabilir.

(Bu karar sadece performansa dayalı olmasa da, referansların geri alınmasına da izin verir.)


Bunun kısmen tarihsel olduğunu düşünüyorum - normal bir ifadeyi DFA'ya dönüştürmek için kullanılan algoritma, önceki araçların bazıları (sed ve grep, sanırım) geliştirilirken patentlendi. Elbette bunu tamamiyle emin olmayan derleyiciler profesörümden duydum, bu yüzden bu üçüncü elden bir hesap.
Tikhon Jelvis

5

Bir O(1)algoritma:

def constant_time_algorithm
  one_million = 1000 * 1000
  sleep(one_million) # seconds
end

Bir O(n)algoritma:

def linear_time_algorithm(n)
  sleep(n) # seconds
end

Açıktır ki, herhangi bir değeri için , örnekte verilen algoritma olacak daha hızlı daha algoritması.nn < one_millionO(n)O(1)

Bu örnek biraz karmaşık olsa da, aşağıdaki örneğe ruhu eşittir:

def constant_time_algorithm
  do_a_truckload_of_work_that_takes_forever_and_a_day
end

def linear_time_algorithm(n)
  i = 0
  while i < n
    i += 1
    do_a_minute_amount_of_work_that_takes_nanoseconds
  end
end

Sen gerekir senin içinde sabitleri ve katsayıları biliyorum Oifadesi ve gereken beklenen aralığı bellidir nbelirlemek amacıyla, önsel algoritma daha hızlı sona erecek olan.

Aksi halde, algoritmanın daha hızlı olduğu bir posteriori belirlemek için iki algoritmayı beklenen aralıktaki değerlerle karşılaştırmanız gerekir .n


4

Sıralama:

Ekleme sıralama O (n ^ 2), ancak az sayıdaki öğe için diğer O (n * log (n)) sıralama algoritmalarından daha iyi performans gösterir.

Çoğu sıralama uygulamasının iki algoritma kombinasyonu kullanmasının nedeni budur. Örneğin, büyük dizileri belirli bir boyuta ulaşana kadar ayırmak için birleştirme sıralaması kullanın, ardından daha küçük birimleri sıralamak ve birleştirme sıralamasıyla tekrar birleştirmek için ekleme sıralamasını kullanın.

Bu tekniği kullanan Python ve Java 7'nin geçerli varsayılan uygulamasını Timsort'a bakın .



3

Bellekteki bubblesort, program diske değiştirilirken hızlı bir şekilde daha iyi performans gösterebilir veya karşılaştırırken her öğeyi diskten okuması gerekebilir.

Bu onunla ilgili olabileceği bir örnek olmalı.


Quicksort ve bubblesort'ta alıntı yapılan karmaşıklıklar, O (1) rasgele hafıza erişimini varsaymıyor mu? Bu artık böyle olmazsa, hızlı puanlama karmaşıklığının yeniden gözden geçirilmesi gerekmez mi?
Viktor Dahl

@ViktorDahl, öğe erişim süresi, sıralama algoritması karmaşıklıklarında geleneksel olarak ölçülenlerin bir parçası değildir , bu nedenle "O (1)" burada doğru kelime seçimi değildir. Bunun yerine "sabit zaman" kullanın. PHK, bir süre önce bazı öğelerin diğerlerinden daha almanın daha pahalı olduğunu bilen sıralama algoritmaları hakkında bir makale yazdı (sanal bellek) - queue.acm.org/detail.cfm?id=1814327 - ilginç bulabilirsiniz.

Şimdi hatamı görüyorum. Biri genellikle karşılaştırma sayısını ölçer ve tabii ki depolama ortamının hızından etkilenmezler. Ayrıca, bağlantı için teşekkürler.
Viktor Dahl

3

Genellikle, daha gelişmiş algoritmalar belirli miktarda (pahalı) kurulum varsaymaktadır. Yalnızca bir kez çalıştırmanız gerekirse, kaba kuvvet yöntemiyle daha iyi olabilirsiniz.

Örneğin: ikili arama ve karma tablo araması, arama başına doğrusal aramadan sonra çok daha hızlıdır , ancak sırasıyla listeyi sıralamanızı veya karma tablosunu oluşturmanızı gerektirir.

Bu sıralama size N log (N) olacak ve hash tablo en az N'ye mal olacak. Şimdi yüzlerce veya binlerce arama yapacaksanız, bu hala itfa edilmiş bir tasarruf. Ancak yalnızca bir veya iki arama yapmanız gerekiyorsa, yalnızca doğrusal aramayı yapmanız ve başlangıç ​​maliyetinden tasarruf etmeniz mantıklı olabilir.


1

Şifre çözme genellikle 0 (1) olur. Örneğin, DES için anahtar alan 2 ^ 56'dır, bu nedenle herhangi bir mesajın şifresini çözmek, sabit bir zaman işlemidir. Orada sadece 2 ^ 56 faktör var, bu yüzden gerçekten büyük bir sabit.


Bir mesajın şifresinin çözülmesi O ( n ), burada n mesajın boyutuyla orantılı mı? Doğru anahtara sahip olduğunuz sürece, anahtarın boyutu dikkate bile alınmaz; Bazı algoritmaların minimum anahtar kurulum / genişletme süreçleri vardır (DES, RSA - anahtar üretiminin hala karmaşık bir görev olabileceğine, ancak anahtar genişletmeyle ilgisi yoktur), ancak diğerleri oldukça karmaşıktır (Blowfish akla gelir), ancak Bir kez yapıldığında, gerçek işi yapma zamanı mesajın büyüklüğü ile orantılıdır, dolayısıyla O (n).
CVn

Muhtemelen şifre çözme yerine kriptananaliz demek istiyorsun?
leftaroundabout

3
Evet, sabit olmak için alabileceğiniz ve O olarak bir algoritma ilan edebileceğiniz çok sayıda şey vardır (1). [Sınıflandırma, öğelerin, örneğin, ya da
bignum

1

Kümelerin farklı uygulamaları aklıma geldi. En naiflerden biri, onu bir vektör üzerinde uygulamaktır; bunun anlamı removehem de containsdolayısıyla addhepsi O (N) anlamına gelir .
Bunun bir alternatifi, girdi karma değerlerini girdi değerlerine eşleyen bazı genel amaçlı karma işlemlerin üzerine uygulamaktır. İçin O (1) ile bu tür bir dizi uygulama yapar add, containsve remove.

Eğer N'nin 10 civarında olduğunu varsayarsak, ilk uygulama muhtemelen daha hızlıdır. Bir eleman bulmak için tek yapması gereken 10 değeri bir ile karşılaştırmak.
Diğer uygulama ise, 10 kıyaslama yapmaktan çok daha pahalı olabilecek her türden akıllı dönüşüme başlamak zorunda kalacak. Tüm ek yüklerinizde, önbellek kaçırmanız bile olabilir ve bu durumda çözümünüzün teoride ne kadar hızlı olduğu önemli değildir.

Bu, N'nin yeterince küçük olması halinde, aklınıza gelebilecek en kötü uygulamanın nezih bir uygulamadan daha iyi performans göstereceği anlamına gelmez. Bu, yeterince küçük bir N için, düşük ayak izi ve ek yüke sahip naif bir uygulamanın aslında daha az talimat gerektirebileceği ve ölçeklendirilebilirliği ilk koyan bir uygulamadan daha az önbellek eksikliğine neden olabileceği ve bu nedenle daha hızlı olacağı anlamına gelir.

Gerçek dünya senaryosunda bir şeyin ne kadar hızlı olduğunu bilemezsiniz, bunu bir taneye koyup ölçene kadar. Genellikle sonuçlar şaşırtıcıdır (en azından benim için).


1

Evet, uygun şekilde küçük N için, her zaman bir N olacak, üstünde her zaman O (1) <O (lg N) <O (N) <O (N log N) <O (N ^ c ) <O (c ^ N) (ki burada O (1) <0 (lg N), bir O (1) algoritmasında, N'nin uygun şekilde büyük olması ve c'nin 1'den büyük olan sabit bir sabit olması durumunda daha az işlem yapacağı anlamına gelir. ).

Belirli bir O (1) algoritmasının tam olarak f (N) = 10 ^ 100 (bir googol) işlemi aldığını ve bir O (N) algoritmasının tamamen g (N) = 2 N + 5 işlemi aldığını söyleyin. O (N) algoritması, N kabaca bir googol olana kadar (aslında N> (10 ^ 100 - 5) / 2), bu nedenle yalnızca N'in 1000 ila milyar arasında olmasını beklerseniz, daha yüksek performans sağlar. O (1) algoritmasını kullanarak büyük bir ceza alırdı.

Ya da gerçekçi bir karşılaştırma için, n basamaklı sayıları birlikte çarptığınızı söyleyin. Karatsuba algoritması en fazla 3 n ^ işlemleri (3 gr) (kabaca O (n ^ 1.585)) ise Schonhage-Strassen algoritması Ç (N günlük K günlüğü K) olan daha hızlı bir düzen , ancak alıntı wikipedia:

Uygulamada Schönhage-Strassen algoritması, Karatsuba ve Toom – Cook çarpımı gibi eski yöntemlerden 2 ^ 2 ^ 15 ila 2 ^ 2 ^ 17 (10.000 ila 40.000 ondalık basamak) ötesindeki yöntemler için daha iyi performans göstermeye başlar. [4] [5] [6] ]

Öyleyse birlikte 500 basamaklı sayıları çarpıyorsanız, büyük O argümanları tarafından "daha hızlı" olan algoritmayı kullanmak mantıklı değildir.

EDIT: f (N) 'yi, f (N) / g (N)' nin N-> sınırını alarak limiti g (N) 'yi bulabilirsiniz. Eğer sınır 0 ise, o zaman f (N) <g (N), limit sonsuz ise o zaman f (N)> g (N) ve limit başka bir sabit ise f (N) ~ g (N) Büyük O notasyonu açısından.


1

Doğrusal programlama için simpleks metot en kötü durumda üstel olabilir, nispeten yeni iç nokta algoritmaları polinom olabilir.

Bununla birlikte, pratikte simpleks metodu için üstel en kötü durum ortaya çıkmaz - simpleks metodu hızlı ve güvenilirdir, aynı zamanda erken iç nokta algoritmaları rekabet edemeyecek kadar yavaştır. (Orada daha modern iç nokta algoritmaları şimdi vardır - ... çok ama simpleks yöntemdir rekabetçi)


0

Ukkonen'in bina son eki denemeleri için algoritması O (n log n) 'dir. “Çevrimiçi” olma avantajına sahiptir - yani, daha fazla metin ekleyerek ekleyebilirsiniz.

Son zamanlarda, diğer daha karmaşık algoritmaların pratikte daha hızlı olduğu iddia edildi, çünkü büyük ölçüde bellek erişimi daha yüksek bir konuma sahipti, böylece işlemci önbellek kullanımını arttırdı ve CPU boru hattı duraklarından kaçınıldı. Örneğin, işlem süresinin% 70-80'inin hafıza için harcandığını iddia eden bu araştırmaya ve "wotd" algoritmasını tanımlayan bu makaleye bakınız.

Son ekleri genetikte (eşleşen gen dizileri için) ve Scrabble sözlüklerinin uygulanmasında bir şekilde daha az önemlisi önemlidir.


0

Herhangi bir iyi tanımlanmış problem için her zaman en hızlı ve en kısa algoritma vardır . Sadece tamamen teorik olarak (asimptotik olarak) en hızlı algoritma olsa bile.

Sorun herhangi açıklama Verilen P o sorun için ve bir örnek I , olası tüm algoritmalar sıralar A ve ispatlar Pr olsun her tür çifti için kontrol Pr geçerli bir kanıtıdır A için asimptotik en hızlı algoritmadır P . Eğer böyle bir kanıt bulursa , I üzerinde A çalıştırır .

Bu problem geçirmez çiftin aranması karmaşıklığı O (1) (sabit bir problem için P ), bu yüzden problem için her zaman asimptotik olarak en hızlı algoritmayı kullanırsınız. Bununla birlikte, bu sabit hemen hemen tüm durumlarda çok açık bir şekilde büyük olduğundan, bu yöntem pratikte tamamen işe yaramaz.


0

Birçok dil / çerçeve KMP yerine dizeleri eşleştirmek için naif desen eşleştirmesini kullanır . Ababaabababababaabababababab'dan ziyade Tom, New York gibi bir dize ararız.

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.