Yüksek dereceli algoritmalar


35

İyi bilinen algoritmaların çoğu, giriş ve çıkışlarının "düz" veri olduğu anlamında birinci derecedendir. Bazıları, örneğin sıralama, karma tablolar veya harita ve katlama işlevleri gibi önemsiz bir şekilde ikinci derecedir: bir işlev tarafından parametrelendirilirler, ancak diğer girdi verilerinin parçalarına çağrılması dışında gerçekten ilginç bir şey yapmazlar.

Bazıları ayrıca ikinci dereceden fakat biraz daha ilginç:

  • Monoitler tarafından parametreleştirilmiş parmak uçları
  • Monoton bir yüklemede parmak ucunu bölme
  • Önek toplamı algoritmaları, yine genellikle bir monoid veya bir yüklem vb.

Son olarak, bazıları benim için en ilgi çekici olan anlamıyla "gerçekten" üst düzey:

  • Y birleştirici
  • Fark listeleri

Önemsiz başka yüksek dereceli algoritmalar var mı?

Sorumu açıklığa kavuşturmak için "önemsiz yüksek dereceli" ifadesiyle "işlemsel formalizmin yüksek dereceli olanaklarını algoritmanın arayüzü ve / veya uygulamasında kritik bir şekilde kullanmak" demek istiyorum.


3
Bir zamanlar benzer bir şey sordum. Burada birkaç cevap: caml.inria.fr/pub/ml-archives/caml-list/2004/09/…
Radu GRIGore

Siz algoritmaları alan ve / veya algoritmaları döndüren algoritmalar hakkında mı konuşuyorsunuz?
Pratik Deoghare

Yanıtlar:


13

Http://math.andrej.com/ adresinde , örneğin çifte üsteller hakkında yazılan bir çok yüksek dereceli fonksiyon vardır , aşağıdaki Haskell tipi belirir (genişletilmiş tür eşleşmeleriyle):

shift :: Bool -> ((Int -> Bool) -> Bool) -> ((Int -> Bool) -> Bool)

Sonlu Zaman İçinde Sonsuz Arama için A Haskell Monad'ın gönderisiyle de çok eğlenebilirsiniz - örneğin:

newtype S a = S ((a -> Bool) -> a)
bigUnion :: S (S a) -> S a

Sanırım bigUnion türü 4. veya 5. sırada!


22

Bu terimlerle açık bir şekilde tarif edilmese de, "gerçekten 2. derece" olan bir sürü algoritma vardır. Doğrusal zaman algoritmalarına ne zaman sahip olsak, örtük, girdilere bir tür kehanet erişimidir, yani girdiyi gerçekten bir işlev olarak ele alır.

Örnekler:

(1) Bir "ayrılık oracle" ile çalışırken elipsoid algoritmaları (örneğin, http://math.mit.edu/~vempala/18.433/L18.pdf )

(2) Submodüler fonksiyon minimizasyonu (örneğin http://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )

(3) Bütün mal testi alanı gerçekten bu formdadır ( http://www.wisdom.weizmann.ac.il/~oded/test.html )

(4) Sorgu modelindeki birleşik açık artırmalar (örneğin, http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )


15

Bu sorunun başka bir cevabı var: Hiç yok. Daha spesifik olarak, bu tür herhangi bir (uygulanabilir!) Daha yüksek dereceli algoritma, işlevsizleştirme kullanan birinci dereceden bir algoritmaya mekanik olarak eşdeğerdir .

Daha kesin olalım: gerçekten yüksek emir algoritmaları varken, uygulamada her örneği tamamen birinci dereceden bir program olarak yeniden yazmak her zaman mümkün . Başka bir deyişle, doymuş bir yüksek dereceli program yoktur - temel olarak programların giriş / çıkışları bit dizeleridir. [Evet, bu bit dizeleri işlevleri temsil edebilir, ancak nokta bu: işlevleri temsil eder, işlev değildir ].

Zaten verilen cevaplar mükemmel ve cevabım onlarla çelişkili olarak değerlendirilmemelidir. Soruyu biraz daha geniş bir bağlamdan yanıtlıyor gibi düşünülmelidir (bağımsız algoritmalar yerine tam programlar). Ve bu bağlam değişikliği, cevabı oldukça kökten değiştiriyor. Cevabımın amacı, insanlara bunu unutmak için çok kolay olan hatırlatmak.


Herhangi bir yüksek dereceli algoritmanın, aynı dış şartnameye sahip bazı birinci dereceden algoritmaya eşdeğer olduğunu kabul ediyorum, ancak bu bizim iç özellikleri hakkında tartışmamızı engellememelidir. Bir şeyi temsil etmekle bir şey olmak arasında hiçbir fark yoktur.
jkff

1
@jkff: İlk konunuza katılıyorum - kesinlikle bu iç özellikleri tartışmalıyız. İkinci noktaya kesinlikle katılmıyorum: bir şekilde uzantıların ve amaçların “aynı şekilde” olduğunu iddia ediyorsunuz, bu sadece açık bir şekilde yanlıştır. [Matisse resmini hatırlatıyor 'bu bir boru değil']
Jacques Carette

Ah, evet, "Eta Dönüşümünün Antlaşması". (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

Eğer iki şey eşdeğerse (birbirini temsil ederek), onlardan birinin varlığını inkar edemeyeceğinizi iddia ediyorum :)
jkff

@jkff: Buna katılmamak zor!
Jacques Carette

13

Ayrıştırıcı birleştirme kitaplıklarında, işlevin sırası genellikle oldukça yüksektir. Check out Ayrıştırma veya Neden birisi sana Hiç için kullan Altıncı-al İşlevini ister için bile İleri Düzey İşlevleri? Chris Okasaki tarafından. Fonksiyonel Programlama Dergisi , 8 (2): 195-199, Mart 1998.


Bu harika bir makale ama aradığım şey değil. Birleştiriciler daha yüksek dereceli olsalar da, çok basit ve bağımsızdırlar ve bunlardan herhangi biri önemsiz olmayan bir algoritma / veri yapısı olarak sayılmazdı (ancak, belki de birleştirici ayrıştırıcıların kendileri). Aksine, Y birleştiricisi sabit bir nokta bulmak için son derece önemsiz bir algoritmadır ve fark listeleri tamamen üst düzey işlevlerden inşa edilmiş akıllı bir veri yapısıdır. (Cevabınızı baltalamıyorum, sadece sorumu açıklığa kavuşturmaya çalışıyorum)
jkff

13

Hesaplanabilir analiz, gerçek sayıları sınırsız miktarda bilgi içerdiğinden, gerçek sayıları programlı olarak karakterize eder ve dolayısıyla gerçek sayılarla ilgili işlemler soru anlamında daha üst düzeydedir. Tipik olarak, gerçek sayılar, sonsuz bit akışının, Cantor uzayının topolojik bir görünümü kullanılarak hesaplanabilir topolojinin daha geniş alanına ilgi göstererek sunulur.

Klaus Weihrach, bu konuda hesaplanabilir topolojinin İkinci Tip Etkililik Hiyerarşisi olarak bahsetti . Bu konuda daha fazla bilgi için, Weihrach & Grubba, 2009, İlköğretim Hesaplamalı Topoloji ve John Tucker'ın araştırma sayfasına, Topolojik Verilerle Hesaplama bölümüne bakın . Tucker'ın soruma Cantor Space Uygulamaları'ndan bahsettim .


Bu da genel olarak hesaplanabilir matematiksel nesnelere oldukça doğal bir şekilde uzanır: diğer hesaplanabilir sayılar (zorunlu olarak gerçek değil), sonsuz grupların hesaplanabilir elemanları (halkalar, cebirler, ...), uzayda hesaplanabilir noktalar, vb. Bütün bu durumlarda, algoritmik teori, işlevsel sunumdan (matematiksel nesneyi nasıl hesaplayacağınızla) ve nesnenin kendisinden değil, bilgiyi çıkarmakla ilgilidir.
ex0du5

13

Bir süreklilik modülü , fonksiyonel bir haritasıdır mbir (devamlı), fonksiyonel kabul F : (nat -> nat) -> natve bir sayı üretir k, böylece F f = F gher f i = g iTüm i < k. Süreklilik modülünü (çok verimli olmayanları) hesaplamak için algoritmalar vardır, bu da onu 3. dereceden bir algoritmanın örneği yapar.


9

Noam'ın cevabını tamamlamak için, çıktının bir fonksiyonun (açık bir temsili) olması önemli olduğu çeşitli durumlar da vardır .

İlginç bir örnek, listeyle kodlanabilen bir kodun tanımıdır. Let bir kod olabilir. Olasılıklı bir algoritmanın listesinin kodunu eğer , olasılıklı makinelerini :C:0,1n0,1mA (α,L,ϵ)CnAM1,,ML

w0,1m,PrA[m, (Ag(C(m),w)α i[L], j[n], PrMi[Mi(j)=mj]1ϵ)]2/3

Burada , iki dizenin üzerinde uzlaştığı koordinatların belirtir. Diğer bir deyişle, her bir alınan bir kelime için, çıkış , en azından bir olasılık ile, içermelidir , bir makine olup, -approximates her mesaj için olan kodlayan en azından kabul eder koordinatlarının fraksiyonu Alınan kelimebir 2 / 3 ε m m αAgA2/3ϵmmα


5

Grafik algoritmalarında, köşeler ve kenarlar genellikle düz veri olarak düşünülür, ancak isteğe bağlı olarak programlı bir şekilde üretilebilmeleri için üretken biçimde genelleştirilebilirler.

Doktora (hesaplama kimyasında), daha çok sıralı biçimde birçok grafik algoritmasını uygulamıştım, onları esaslı grafiklerin analizine uygulamak için, özellikle de gerçek grafiklerim sonsuz olduğu için açıkça saklamayı göze alamazdım! Spesifik olarak, birim hücrelerin 3B eğimi (süper hücreler) olarak gösterilen amorf malzemelerin topolojisini inceliyordum.

Örneğin, aşağıdaki igibi bir köken tepe noktasının en yakın en yakıntaki kabuğunu hesaplamak için bir işlev yazabilirsiniz :

nth i 0 = {i}
nth i 1 = neighbors i
nth i n = diff (diff (fold union empty (map neighbors (nth i (n-1)))) (nth i (n-1))) (nth i (n-2))

nerede neighborsVerilen vertexe köşe komşu kümesini döndüren bir fonksiyondur.

Örneğin, 2D kare kafes:

neighbors (x, y) = {(x-1, y), (x+1, y), (x, y-1), (x, y+1)}

Bu bağlamdaki diğer ilginç algoritmalar Franzblau'nun en kısa yol halkası istatistiklerini içerir.


Bu beni bir zamanlar sahip olduğum bir soruya getiriyor. Grafikleri bu şekilde tanımlamanın programatik yolları varsa, kendinden referanslı bir paradoksal grafik tanımlamanın bir yolu var mı?
Suresh Venkat

1
@Suresh: Russell'ın paradoksunu işlevsel bir dilde çoğaltmak mümkündür; değerlendirildiğinde sonsuz bir döngüde sıkışıp kalacak. Bakınız, örneğin, blog.sigfpe.com/2008/01/type-that-should-not-be.html{x:xx}{x:xx}
sdcvvc

Emin. Ama bu kendine referans bir grafik mi?
Suresh Venkat

@Suresh: İşlevsel bir dilde, bir tür Utepe noktaları ve U -> U -> Boolkenarların bir işlevi olduğu anlamında tanımlanan bir grafiktir .
sdcvvc
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.