Fonksiyonel programlama dili uygulamalarında Algoritma Karmaşıklık Analizi


10

Bugün algoritma analizinin hesaplama modeline göre değiştiğini öğrendim . Hiç düşünmediğim ya da duymadığım bir şey.

User @chi tarafından daha fazla örnek veren bana verilen bir örnek :

Örneğin şu görevi göz önünde bulundurun: verilen x i döndürür . RAM'de, dizi erişimi sabit zaman olduğundan bu O ( 1 ) olarak çözülebilir . TM'leri kullanarak, tüm girişi taramamız gerekir, bu yüzden O ( n )(i,x1,,xn)xiO(1)O(n)

Bu bana işlevsel dilleri merak ediyor; Anladığım kadarıyla, "İşlevsel diller lambda hesabı ile yakından ilgilidir" (Yuval Filmus'un buraya yaptığı bir yorumdan ). İşlevsel diller lambda hesabına dayalıysa, ancak RAM tabanlı makinelerde çalışıyorlarsa, tamamen işlevsel veri yapıları ve diller kullanılarak uygulanan algoritmalar üzerinde karmaşıklık analizi yapmanın doğru yolu nedir?

Tamamen Fonksiyonel Veri Yapılarını okuma fırsatım olmadı, ancak konuyla ilgili Wikipedia sayfasına baktım ve bazı veri yapılarının geleneksel dizilerin yerini aldığı görülüyor:

"Diziler, yalnızca işlevsel uygulamayı kabul eden harita veya rastgele erişim listesi ile değiştirilebilir, ancak erişim ve güncelleme süresi logaritmiktir."

Bu durumda, hesaplama modeli farklı olurdu, doğru mu?


3
O(logn)O(logn)n

1
O(1)

1
Farklı bir hesaplama modeline örnek olarak lambda hesabı terimi üzerinde yapılan beta indirimi sayısı verilebilir. FP'de daha mantıklıysa, lambda hesabı olarak giyinmiş bir ram modeli kullanıyoruz
Kurt Mueller

1
O(2n)O(n)

1
İşlevsel dilinizin istekli veya tembel / katı veya katı olmadığını bilmeniz gerektiğini unutmayın. Son zamanlarda Haskell'de (katı olmayan) gerçek dünya algoritmasının polinom olduğu, ancak OCaml (katı) 'ya naif çevirinin üstel olduğu bir durumla karşılaştım.
Eric Lippert

Yanıtlar:


6

İşlevsel dilinizin anlambilimine bağlıdır. Programlama dillerinde tek başına algoritma analizi yapamazsınız çünkü ifadelerin gerçekte ne anlama geldiğini bilmiyorsunuz. Dilinizin belirtimi, yeterince ayrıntılı anlambilim sağlamalıdır. Diliniz lambda hesabı açısından her şeyi belirtirse, indirimler için bazı maliyet ölçülerine ihtiyacınız vardır (bunlar O (1) mi yoksa azalttığınız terimin boyutuna mı bağlı?).

Çoğu işlevsel dilin bu şekilde yapmadığını ve bunun yerine "işlev çağrıları O (1), bir listenin başına eklenen O (1)" gibi şeyler gibi daha yararlı ifadeler sağladığını düşünüyorum.


Cevabınızı anladığımıza inanıyorum (yanlış anlama büyük olasılıkla lambda kalkülüsünde anlama eksikliğimden kaynaklanmaktadır): Temelde analizi, çünkü belirli işlemlerin dil başına farklı anlamları vardır. Anlayışım doğru mu?
Abdul

Evet. Bir algoritmanın çalışma zamanını analiz edebilmeniz için dil tasarımcınızın dilde yazabileceğiniz şeylerin gerçekte ne anlama geldiğini söylemesi gerekir.
adrianN

"Programlama dillerinde tek başına algoritma analizi yapamazsınız" - bu genel olarak FP dillerini veya dillerini mi ifade ediyordu? Daha önceye atıfta bulunuyorsak, okuldaki analizi nasıl böyle genel bir şekilde algoritma yaparız? Java, C / C ++, Python problemleri arasında analiz yaparız? Hepsi çok benzer oldukları için mi? Yoksa temeldeki veri yapıları ve ADT'lerin hepsi aynı ve aynı şekilde uygulandığından mı? Veya son olarak, bu kurslar sadece eğitim amaçlı olduğu ve kesin olarak doğru olması gerekmediği için mi?
Abdul

1
Tüm programlama dilleri için geçerlidir. Kesinlikle doğru olmak için, önce bir makine modelini düzeltmeniz gerekir, RAM'i ve desteklediği (küçük bir avuç) talimatı söyleyin. Yalnızca bu talimatları kullanarak programlarda analiz yapabilirsiniz. Ardından programlama dilinizin bu makine modeliyle eşlenmesini düşünebilirsiniz. Ardından programları programlama dilinde analiz edebilirsiniz. Çok titiz bir tedavi için Knuth'un Bilgisayar Programlama Sanatında bunu nasıl yaptığını kontrol edin. Büyük O gizleme sabitleri nedeniyle bunların çoğu basitleştirilebilir.
adrianN
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.