Algoritma karmaşıklığı işlevsel diller için nasıl modellenir?


38

Algoritma karmaşıklığı daha düşük seviye detaylarından bağımsız olacak şekilde tasarlanmıştır, ancak zorunlu bir modele dayanır, örneğin bir dizideki erişime ve bir ağaçtaki bir düğümü değiştirme O (1) zaman alır. Bu, saf işlevsel dillerde geçerli değildir. Haskell listesi erişim için doğrusal zaman alır. Ağaçtaki bir düğümü değiştirmek, ağacın yeni bir kopyasını almayı içerir.

Öyleyse, fonksiyonel diller için alternatif bir algoritma karmaşıklığı modeli olmalı mı?


3
Aradığın şey bu olabilir.
Aristu

1
Sorunuz burada cevaplanabilir: cs.stackexchange.com/q/18262/755 . Özel olarak, en fazla bir oranı ile bir zorunluluk dilde zaman karmaşıklığından tamamen fonksiyon dil alandan farklı zaman karmaşıklığı her iki yönde yeteneklerine uygun bazı varsayım için. O(logn)
DW

3
GHC Haskell, değişken dizileri ve ağaçları destekler ve hiçbir şey yapmaz; dizi durumları yapmanıza ve ağaç düğümlerini O (1) zamanında, "durum iplikleri" ( STmonad'ler) kullanarak dizi erişimi yapmanıza ve değiştirmenize izin verir .
Tanner Swett

1
@BobJarvis Bağlıdır. Bir liste sizin için soyut bir veri türü mü yoksa özellikle bağlantılı listeler mi düşünüyorsunuz?
Raphael

1
Algoritmik karmaşıklığı modellemek için hangi amacı arıyorsunuz? Matematiksel olarak saf olan veya pratik olan bir şey mi arıyorsunuz? Pratik bir değer için, size ezberlemenizin olup olmadığı gibi şeylere dikkat etmelidir, ancak matematiksel bir bakış açısıyla uygulamanın yetenekleri önemli olmamalıdır.
Cort Ammon

Yanıtlar:


34

λλβ(λx.M)NM[N/x]

Fakat bu iyi bir karmaşıklık ölçüsü mü?

tr(.)λpM|M|Mp(|M|) βtr(M)p(|tr(M)|)

Bu, λ-analizde elde edilip edilmeyeceği belli değildi. Ana problemler aşağıdaki gibidir.

  • Üstel büyüklükte normal formlar üreten (polinom adımda) terimler vardır. Normal formları yazmak bile üssel zaman alır.
  • Seçilen azaltma stratejisi önemli bir rol oynar. Örneğin, polinomdaki paralel β-adımların sayısında ( optimal λ-azaltma anlamında ) azalan , ancak karmaşıklığı temel olmayan (yani üssel olandan daha kötü olan) terimler ailesi vardır .

β

Diğer değerlendirme stratejileri için durumun ne olduğundan emin değilim. Uzay karmaşıklığı için benzer bir programın yapıldığını bilmiyorum.


23

Algoritma karmaşıklığı düşük seviye detaylardan bağımsız olacak şekilde tasarlanmıştır.

Hayır gerçek değil. Bazı makine modellerinde temel işlemleri her zaman sayıyoruz:

  • Turing makineleri için adımlar.
  • RAM'lerde temel işlemler.

ΩΘOΘ

Bu nedenle, sorunuzun basit bir cevabı var: bir makine modelini ve hangi "işlemlerin" sayılacağını düzeltin. Bu size bir ölçü verecektir . Sonuçların işlevsel olmayan algoritmalarla karşılaştırılabilir olmasını istiyorsanız, programlarınızı RAM (algoritma analizi için) veya TM (karmaşıklık teorisi için) olarak derlemeniz ve sonucu analiz etmeniz en iyi şekilde sunulur. Bu süreci kolaylaştırmak için transfer teoremleri bulunabilir.


Kabul. Yan Not: İnsanlar do işlemler "sabit" ne dair bir çok hata yapmak sık. Örneğin, a + b'nin O(1)gerçekte olduğu zaman olduğu varsayılırO(log ab)
Paul Draper

3
@PaulDraper Bu mutlaka bir hata değil, farklı bir varsayımdır. İstediklerimizi modelleyebiliriz - soru, ilginç sorulara cevap verip vermediği. Ayrıca buraya bakınız .
Raphael

"makine modelinden kurtulmak" gibi korkunç bir şey gibi geliyor
Paul Draper

@PaulDraper "Makine" kelimesine ne gibi düşünceler ekleyeceğinize bağlıdır. Ayrıca bu tartışmaya bakınız . FWIW, birim maliyet RAM modeli - muhtemelen algoritma analizinde standart model! - olduğu aksi takdirde on yıllardır kullanılmaktadır olmazdı, kullanışlı. Sıralama, arama ipi vb. İçin bilinen tüm sınırlar bu modele dayanmaktadır. Mantıklı çünkü gerçek bilgisayarları sayılar kayıtlara sığdığı sürece iyi modelliyor.
Raphael

1

Karmaşıklık ölçünüzü bazı temel soyut makineler açısından formüle etmek yerine, dilin tanımlarının kendisine maliyet yazabilirsiniz - buna Maliyet Dinamiği denir . Biri, dilindeki her değerlendirme kuralına bir bileşim biçiminde bir maliyet ekler - yani bir işlemin maliyeti, alt ifadelerinin maliyetinin bir işlevidir. Bu yaklaşım işlevsel diller için en doğal olanıdır, ancak iyi tanımlanmış herhangi bir programlama dili için kullanılabilir (elbette çoğu programlama dili ne yazık ki iyi tanımlanmamıştır).


<Silinen bir makine modelinin tartışılması > Bu tartışmaya sohbette devam edelim .
Raphael
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.