Donanım / uygulama algoritmaların zaman / mekan karmaşıklığını etkiler mi?


32

Ben bir CS öğrencisi bile değilim, bu yüzden aptalca bir soru olabilir, ama lütfen yanımda ol ...

Bilgisayar öncesi çağda, yalnızca bir dizi çekmeceye benzer bir şeyle bir dizi veri yapısını uygulayabiliriz. Biri değeri çıkarmadan önce çekmeceyi karşılık gelen indeks ile konumlandırması gerektiğinden, dizi aramasının zaman karmaşıklığı , ikili arama varsayılır.O(lOg(n))

Ancak, bilgisayarların icadı büyük bir fark yarattı. Modern bilgisayarlar RAM'lerinden o kadar hızlı okuyabilirler ki, şimdi dizi aramasının zaman karmaşıklığını olarak görüyoruz (teknik olarak bile geçerli değil, çünkü kayıt defterini daha büyük bir mesafeye taşımak daha fazla zaman alıyor, vs.)O(1)

Diğer bir örnek Python sözlükleridir. Bir kişi kötü yazılmış bir aşırı sihirli yöntemle (veya gülünç derecede kötü bir şans, yani çok fazla karma çarpışma olan anahtarlar nin sözlük erişiminin karmaşıklığına sahip olsa da, genellikle olduğu varsayılmaktadır . Bu durumda, zaman karmaşıklığı hem Python sözlüklerinin karma tablo uygulamasına ve anahtarların karma fonksiyonlarının uygulanmasına bağlıdır.0 ( 1 )O(n)__hash__O(1)

Bu, donanım / uygulamanın algoritmaların zaman karmaşıklığını etkileyebileceği anlamına mı geliyor? (Her iki örnek de algoritmalar yerine veri yapılarıyla ilgili olsa da, ikincisi eskisi üzerine kuruludur ve veri yapılarının zaman karmaşıklığını hiç duymadım, bu yüzden burada "algoritmalar" terimini kullanıyorum)

Bana göre algoritmalar soyut ve kavramsal, zaman / mekan karmaşıklığı gibi özellikleri belirli bir şekilde uygulanıp uygulanmadıklarından etkilenmemeli, değil mi?


Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
Gilles 'SO- kötülük' dur

Yanıtlar:


42

Emin. Kesinlikle. İşte rahatsızlığınızı nasıl uzatacağınız.

Algoritmaların çalışma zamanını analiz ettiğimizde, belirli bir hesaplama modeline göre yapıyoruz . Hesaplama modeli, her bir temel işlemin gerçekleştirilmesi için geçen zaman gibi şeyleri belirtir (dizi arama zamanı veya O ( 1 ) zaman?). Algoritmanın çalışma süresi hesaplama modeline bağlı olabilir.O(günlükn)O(1)

Bir hesaplama modeli seçtiğinizde, algoritmanın analizi artık donanıma bağlı olmayan tamamen soyut, kavramsal, matematiksel bir alıştırmadır.

Ancak, uygulamada genellikle donanımımızın gerçekliğini yansıtan bir hesaplama modeli seçmek istiyoruz - en azından makul bir dereceye kadar. Dolayısıyla, donanım değişirse, algoritmalarımızı yeni donanıma daha uygun olan farklı bir hesaplama modeli altında analiz etmeye karar verebiliriz. Bu, donanımın çalışma süresini nasıl etkileyebileceğidir.

Bunun açık olmamasının nedeni, giriş sınıflarında, genellikle hesaplama modelinden bahsetmememizdir. Biz sadece açık bir şekilde belirtmeden, sadece bazı varsayımlarda bulunuyoruz. Pedagojik amaçlar için bu mantıklı, ancak bir maliyeti var - analizin bu yönünü gizliyor. Artık biliyorsun.


Söylediğiniz gibi, rasgele erişim modelini hesaplama modeli olarak kullanıyoruz, ancak bazı hesaplamalar için GPU kullandığımız zaman, bazı algoritmalar için zaman karmaşıklığı SIMD komutlarını kullandıkça değişmektedir.
Derin Joshi,

6
Ayrıca, O () notasyonunun bir üst sınır olduğuna dikkat edin. Çekmece analojisini sınırlı bir boyutta bir çekmece bulsanız bile (gerçek bellek boyut olarak sınırlıdır) bina O (1) zaman alır. En uzak çekmeceye ulaşmanız 20 dakika sürse bile (tüm önbellek özlüyor ve takas alanından verileri yüklemelisiniz) ki bu O (1) kezdir, çünkü 20 dakika belleğe erişmek için gizli sabitiniz olacaktır.
Goswin von Brederlow,

2
O(1)O(n)

1
@CortAmmon: Büyük bir dizide bile, doğrusal öğelerin kullanılması, aradığınız öğelerin birçoğunun tümü dışında çok yakınsa, doğrusal arama kullanmak daha hızlı olabilir. Örneğin, öğelerin% 50'si ilk öğeyle eşleşirse,% 25 ikincisiyle eşleşir,% 12,5'i üçüncü eşleşir, vb. Dışında, tek bir garip öğenin dizinin herhangi bir yerinde olabilecek bir eşleşmesiyle eşleşmesi, beklenen karşılaştırma sayısı N boyutundaki bir listede M araması yapın, 2M + N olur.
supercat

5
@DeepJoshi SIMD talimatları algoritmaların karmaşıklığını değiştirmez. Sadece çarpım sabitini değiştirirler.
Gilles 'SO- kötülük olmayı bırak'

5

Bence soruda temel bir yanlış anlaşılma var. Bir nesneyi sıralanmış bir listede bulunan bir nesneyle (örneğin, bir kitaptaki belirli bir sayfa, numarasını verilen), bir diziden bir öğeyi arayan bir bilgisayarla karşılaştırırsınız.

O(günlükn)O(1)

Bu yüzden, evet, donanım (yani hesaplama modeli), DW'nin açıkladığı gibi algoritmaların çalışma zamanını etkiler , fakat dizi erişim örneğinizin dayandığı göründüğü gibi değildir.


2
Adil olmak gerekirse, "bellek denetleyicisi adres kablolarındaki voltajları on yedili ikili gösterime ayarlar" ve "veriler geri gelir" arasındaki tüm parçaları atladınız. Bu belgelerin birer neredeyse kesin olan OP tarafından açıklanan türden bir ikili arama ağacı; ancak yine de sabit bir zamanda yürütülür, çünkü log n , her n için yaklaşık 64'tür .
Quuxplusone

@Quuxplusone Belleğin hangi kısmı ikili arama kullanıyor? Adres satırları doğrudan bellek hücrelerini seçer.
David Richerby

Uzmanlık alanımın çok dışında faaliyet gösteriyoruz, ancak ima etmeye çalıştığım şey, bir adres kod çözücünün bir yıkıcılar ağacı açısından uygulanacağı . (Fiziksel belleğe doğrudan çarptığımızı, önbelleğe alma ile birlikte gelen ek bir komplikasyonu görmezden geldiğimizi varsayalım .) Yine, tüm bu ekstra komplikasyon sadece O(lg size-of-memory), yani, ihmal edilebilir - ekler .
Quuxplusone

2

Hayır, donanım algoritmaların karmaşıklığını etkilemez.

Ancak , algoritma seçimini etkiler ve karmaşıklığın analizinin kullanışlılığını, analizin hemen hemen anlamsız (veya yalnızca akademik ilginin) olduğu bir noktaya kadar etkileyebilir.

Doğru çekmeceyi bulmak (bir dizi elemanına erişirken), "doğrusal olarak arama" veya "ikili arama yap" algoritmasını değil, "dizini kullanarak doğrudan Nth öğesini aç" algoritmasını kullanır. Algoritmalar değişmez, fakat seçim değişir.

Öte yandan, karmaşıklık analizinin kendisi veya bunun anlamı, donanımdan büyük ölçüde etkilenir .

Karmaşıklık analizleri ile yıldız biçimli birçok algoritma, düşük performans sergileyen veya pratikte işe yaramaz, çünkü önemsiz sabit faktör hiç de önemsiz değil, baskın .

Veya, bir zamanlar doğru olan (ya da çoğunlukla doğru olan) varsayımlar artık geçerli değildir. Örneğin, her işlem çoğunlukla aynıdır (önemli olmayan sadece küçük sabit farklar) veya hangi bellek konumlarına hangi sırayla eriştiğinizde fark yaratmaz. Karmaşıklık analizi yaparak, bazı algoritmaların çok daha üstün olduğu sonucuna varabilirsiniz, çünkü yalnızca bu kadar çok işleme ihtiyaç duyar. Uygulamada, her bir işlemin, artık önemsiz değil, her şeye hükmeden çok büyük bir k tanıtan, garantili bir önbellek özlemesine (veya daha da kötüsü, sayfa hatasına) neden olduğunu görebilirsiniz.
A algoritması, belirli bir büyüklükteki veri kümesini işlemek için 500 işlem gerçekleştiriyorsa ve B algoritması sadece 5 alır, ancak B, her biri yirmi milyon devir yakan 5 hataya neden olursa, o zaman, anaylis veya sağduyu size söyleyebilse de, A daha iyidir.

Bu birkaç yıl önce Cuckoo Hashing gibi komik sürprizlere yol açtı. Bu oldukça üstündü çünkü [uzun süreli faydalar listesi]. Yutturmaca soğuduktan sonra, her erişimde iki önbellek özeti (daha büyük veri setleri için hatalar) olduğunu garanti ettiği için oldukça düşük olduğu ortaya çıktı .

Veri alt kümelerini tanımlamaya ve işlemeye benzer şekilde oldu. Genellikle, bugünlerde doğru çözüm şudur: "sadece hepsini yap" , yani neyi protesto etmeniz ve yapmanız gerektiğine karar vermek yerine, sadece veri grubunun yarısına ihtiyacınız olsa bile, tüm veri setini doğrusal olarak işlemden geçirin. Çünkü, ister inan ister inanma, bu dal yanlışlıkları, önbellek hataları ve sayfa hataları nedeniyle daha hızlı.
3MB'lık bir dosyanın ilk 8kB'sini ve son 3kB'sini okumanız gerekiyor mu? Tamamen dosyayı okuyunuz ve istemediğiniz şeyleri atınız, çünkü aralarında arama yapmak tüm şeyi okumaktan on kat daha yavaş olacaktır.

Logaritmik karmaşıklığa sahip olduğu için bir harita kullanın. Veya sürekli erişim süresi olan bir karma tablo? Sabit sesler harika geliyor. Şey, binden daha az şeyi olan herhangi bir şey için (donanıma, veri boyutuna ve erişim modeline bağlı olarak) doğrusal bir arama aynı derecede iyi veya daha iyi olabilir. Sürpriz.

Dolayısıyla, etkilenen algoritmalar değil, onların yararları ve seçimleridir.

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.