Okasaki'den beri tamamen işlevsel veri yapılarında yeni olan ne var?


563

Chris Okasaki'nin 1998 tarihli "Tamamen işlevsel veri yapıları" kitabından bu yana, çok fazla heyecan verici tamamen işlevsel veri yapısının ortaya çıktığını görmedim; Sadece birkaçını adlandırabilirim:

  • IntMap (ayrıca 1998'de Okasaki tarafından icat edildi, ancak bu kitapta bulunmuyor)
  • Parmak ağaçları (ve monoidler üzerine genellemeleri)

Ağaç değişmezlerini sağlamak için "iç içe tipler" veya "genelleştirilmiş cebirsel veri tiplerini" kullanmak gibi önceden bilinen veri yapılarını uygulamanın bazı ilginç yolları da vardır.

1998'den bu yana başka hangi yeni fikirler ortaya çıktı?


20
Güzel soru. Sadece bana bunu soran bir öğrencim vardı ve cevabı bilmiyordum.
Suresh Venkat

Burada sorun yok, ancak Yığın Taşması ile ilgili daha iyi cevaplar alabilirsiniz. Orada sorarsanız, buradaki tartışmaya dikkat edin ve bağlantı verin.
Charles Stewart

3
Haskell Reddit bunu gördü, bu yüzden oradan da gelen iyi cevaplar olacak ama mükemmel bir soru. Okasaki'nin kitabının tam yarısında olmakla aynı şeyi kendim de düşündüm. +1
Robert Massaioli


Yanıtlar:


553

1998'den beri yayınlanan yeni tamamen işlevsel veri yapıları:

  • 2001: İdeal Haş Ağaçları ve 2000 selefi, Hızlı ve Yer Verimli Trie Araştırmaları , Phil Bagwell : Clojure'un standart kütüphanesinde görünüşe göre temel yapı taşı olarak kullanıldı.

  • 2001: Öncelikli Arama Kuyrukları için Basit Bir Uygulama Tekniği , Ralf Hinze : Bu önemli veri yapısını uygulamak için gerçekten basit ve güzel bir teknik (dijkstra algoritmasında faydalıdır). Uygulama, "görünüm kalıplarının" yoğun kullanımı nedeniyle özellikle güzel ve okunabilir.

  • 2002: Ralf Hinze tarafından tek taraflı esnek dizileri önyükleme : Okasaki'nin rasgele erişim listelerine benzer, ancak bunlar arasında consve indeksleme arasındaki zaman değişimini değiştirmek için ayarlanabilirler .

  • 2003: Radu Mihaescu ve Robert Tarjan'dan yeni katlanabilir ve katlanamayan deques : Okasaki'nin (Kaplan ve Tarjan'ın çalışmasının en son versiyonu 2000 yılında yayınlandı ) söylediği bazı eski çalışmaları (Kaplan ve Tarjan tarafından ) aldı. Bu sürüm bazı yönlerden daha basittir.

  • 2005: Maxifobik yığınlar ( bildiri ve kod ), Chris Okasaki : Yeni, daha verimli bir yapı olarak değil, öncelik sıralarını öğretmenin bir yolu olarak sunuldu.

  • 2006: Tamamen İşlevsel En Kötü Durum Sabit Zamanlı Katlanabilir Sıralı Listeler , Gerth Stølting Brodal, Christos Makris ve Kostas Tsichlas tarafından : O (lg n) ekleme, arama ve silme ve O ile bir yapı göstererek Kaplan ve Tarjan'ın çarpıcı bir sorusunu yanıtlıyor (1) concat.

  • 2008: Etkili Sürüm Kontrolü Konfluenti Kalıcı Denemeler , Erik D. Demaine, Stefan Langerman ve Eric Price : Yaprakların yakınında etkili gezinme ve değişiklik yapma denemeleri için çeşitli veri yapıları sunar. Bazıları tamamen işlevseldir. Diğerleri ise Dietz ve ark. tamamen kalıcı (ancak birleşik olarak kalıcı olmayan veya tamamen işlevsel olmayan) diziler için. Bu makale aynı zamanda , bazen "dinamik ağaçlar" olarak adlandırılan tamamen işlevsel link kesimli ağaçlar da sunmaktadır .

  • 2010: Kırmızı-siyah ağaçlar için tamamen işlevsel bir silme algoritması , Matt Might : Okasaki'nin kırmızı-siyah ağaç yerleştirme algoritması gibi, bu yeni bir veri yapısı veya veri yapısı üzerinde yapılan yeni bir işlem değil, yeni ve daha basit bir yoldur. bilinen bir işlem yazın.

  • 2012: RRB-Ağaçları: Phil Bagwell ve Tiark Rompf'dan Verimli Sayılabilir Vektörler : Dizini korurken değiştirilemez vektör birleştirme, ekleme ve O (lg n) zamanına ayırma işlemlerini destekleyen ve değiştirilemeyen vektör bitiştirmeyi destekleyen Hash Array Eşlenmiş Denemelerin bir uzantısı ve orijinal değişmez vektörün yerleştirme hızları.

1997 yılında biliniyor ancak Okasaki'nin kitabında tartışılmadı:

  • Dengeli arama ağacının diğer birçok stilleri . AVL, erkek kardeş, rütbe dengeli, sınırlı dengeli ve diğer birçok dengeli arama ağacı tamamen yol kopyalama yoluyla işlevsel olarak uygulanabilir (ve uygulanmıştır). Belki de özel sözleri hakediyoruz:

    • Önyargılı Arama Ağaçları , Samuel W. Bent, Daniel D. Sleator ve Robert E. Tarjan : Brodal ve arkadaşlarının 2006 makalesinde ve Demaine ve arkadaşlarının 2008 makalesinde önemli bir unsurdur.
  • Martín Escardó'dan hızlı ve ayrıntılı bir arama yapan Sınırsız kümeler : Belki de bir veri yapısı değil .

  • Braun Ağaçlar üzerinde üç algoritma, Chris Okasaki : Braun ağaçlar, en kötü durumda O (lg n) 'de birçok yığın işlemi sunuyor. Bu sınır diğer birçok veri yapısı tarafından aşılır, ancak Braun ağaçlarconsikinci argümanında tembelbirişlem yapar ve bu nedenle diğer yapıların yapamayacağı bazı şekillerde sonsuz yığınlar olarak kullanılabilir.

  • Gevşemiş min-max yığını: Birleştirilebilir çift uçlu öncelik sırası ve KD yığını: Yuzheng Ding ve Mark Allen Weiss'ın verimli bir çok boyutlu öncelik sırası : Bunlar, gazetelerde tartışılmasa da, tamamen işlevseldir. . Elde edilen zaman sınırlarının, parmak ağaçlarını (Hinze & Paterson veya Kaplan ve Tarjan) k boyutlu öncelik sıraları olarak kullanarak elde edilebileceklerden daha iyi olduğunu sanmıyorum, ancak Ding & Weiss'ın yapılarının daha az yer kullandığını düşünüyorum. .

  • Gérard Huet tarafından Fermuar : Diğer birçok veri yapısında (Hinze & Paterson'ın parmak ağaçları gibi) kullanılır, bu bir veri yapısını içten dışa döndürmenin bir yoludur.

  • Fark listeleri , olağan conslistelerine O (n) dönüşümü olan O (1) katlanabilir listelerdir. Görünüşe göre, Prolog topluluğundaki eskilikten beri bilinenler, burada olağan conslistelerine O (1) dönüşümü var . Geleneksel işlevsel programlamada O (1) dönüşümü imkansız gibi gözükse de, POPL '98'den Minamide'nın delik soyutlaması , saf işlevsel programlama içinde O (1) eklenmesi ve O (1) dönüşümüne izin vermenin bir yolunu tartışıyor. İşlev kapanmalarına dayanan fark listelerinin olağan işlevsel programlama uygulamalarından farklı olarak, delik soyutlamaları temel olarak Prolog fark listeleriyle aynıdır (hem kullanımlarında hem de uygulamalarında). Ancak, yıllarca bunu farkeden tek kişiMinamide'nin yorumcularından biri .

  • O(n)Θ(nlgn)Θ(nlgn)Θ(lg2n)

Okasaki'nin kitabından önce, sırasında ve sonrasında çoğunlukla işlevsel veri yapıları:

  • O(m)mO(lglgn)

  • 1989: Cecilia R. Aragon ve Raimund Seidel'den Randomize Arama Ağaçları : Bunlar, Guy E. Blelloch ve Margaret Reid-Miller tarafından Treaps Kullanarak Hızlı Ayar İşlemlerinde ve Fonksiyonel Set İşlemlerinde Dan Blandford ve Guy Blelloch tarafından tamamen işlevsel bir ortamda tartışıldı. Davranışlar ( kod). Tamamen işlevsel parmak uçları ve önyargılı arama ağaçlarının tüm işlemlerini sağlarlar, ancak onları tamamen işlevsel olmayan bir rastgele kaynak gerektirir. Bu aynı zamanda, operasyonları zamanlayabilen ve uzun olanları tekrarlayabilen bir muhalif varsayarak, işlemlerin zaman aşımına uğramasına neden olabilir. (Bu, zorunlu amortisman argümanlarının kalıcı bir ortamda geçerli olmamalarının nedeni aynıdır, ancak kronometreli bir rakip gerektirir)

  • 1997: Skip-ağaçları, eşzamanlı bir yaklaşımla Skip-listelerine alternatif bir veri yapısı olan Xavier Messeguer ve Skip Listeler ile İkili Arama Ağaçları Arasındaki İkiliği Keşfetmek, Brian C. Dean ve Zachary H. Jones : Skip listeleri tamamen değil. işlevseldir, ancak işlevsel olarak ağaçlar olarak uygulanabilirler. Muameleler gibi, rastgele bir bit kaynağı gerektirirler. (Listeleri atlamak mümkündür, ancak bunları bir ağaca çevirdikten sonra, 2-3 ağaca bakmanın başka bir yolu olduğunu düşünüyorum.)

  • 1998: Okasaki'nin kitabındaki tüm itfa edilmiş yapılar! Okasaki, bu yeni yöntemi, daha önce uyumsuz olduğu düşünülen itfa ve fonksiyonel veri yapılarının karıştırılması için icat etti. Bu, Kaplan ve Tarjan'ın bazen belirttiği gibi, aslında bir yan etki olduğu dekontuna bağlıdır. Bazı durumlarda ( performans nedenleriyle SSD'lerde PFDS gibi ) bu uygun olmayabilir.

  • 1998: Haim Kaplan, Chris Okasaki ve Robert E. Tarjan'ın Basit Konfuge Edilmiş Kalıcı Katlanabilir Listeleri : Başlık altında yapılan düzeltmeleri, itfa edilmiş O (1) katlanabilir deque'leri vermek için kullanır, aynı arayüzü daha önce olduğu gibi sunar (yalnızca işlevseldir, ancak notlandırılır) ) Okasaki'nin kitabında görünen versiyonu. Kaplan ve Tarjan daha önce tamamen işlevsel bir O (1) en kötü durumlu yapı oluşturmuştu, ancak büyük ölçüde daha karmaşıktı.

  • 2007: Bu sayfadaki başka bir cevapta da belirtildiği gibi, yarı kalıcı veri yapıları ve kalıcı sendika bulma Sylvain Conchon ve Jean-Christophe Filliâtre

Okasaki'nin kitabından önce, sırasında ve sonrasında fonksiyonel veri yapılarını doğrulama teknikleri:

Zorunlu veri yapıları veya analizleri Okasaki'nin kitabında tartışılmadı, ancak tamamen işlevsel veri yapılarıyla ilgili:

  • Yumuşak Yığın: Bernard Chazelle'den Optimal Hata Oranına Sahip Bir Öncelik Sırası : Bu veri yapısı dizileri kullanmaz ve böylece #haskell IRC kanalını ve daha sonra Yığın Taşması kullanıcılarını cezbeder , ancakdeleteo (lg n) değerini içerir. genellikle işlevsel bir ortamda mümkün değildir ve tamamen işlevsel bir ortamda geçerli olmayan zorunlu amortismanlı analiz.

  • O (1) parmak güncellemeleri ile Dengeli ikili arama ağaçları . Gelen Veri Yapıları Kalıcı yapma , James R Driscoll, Neil Sarnak, Daniel D. Sleator ve Robert E. Tarjan kalıcı güncellemeler yalnızca O (1) uzay gerekmeyecek kadar kırmızı-siyah ağaç düğümleri gruplandırılması için bir yöntem mevcut. Tarjan, Kaplan ve Mihaescu tarafından tasarlanan tamamen işlevsel dekoller ve parmak ağaçlarının hepsi, her iki uçta da O (1) güncellemelerine izin vermek için çok benzer bir gruplama tekniği kullanır. Athanasios K. Tsakalidis tarafından yerelleştirilmiş arama için AVL ağaçları benzer şekilde çalışır.

  • Eşleştirme yığınları için daha hızlı eşleştirme yığınları ya da daha iyi sınırları : Okasaki kitabı yayımlandı beri zorunlu eşleştirme yığınları birkaç yeni analizler de dahil olmak üzere ortaya çıkmıştır O eşleniyor yığınları (n log log) Maliyeti düşürmek Amr elmasry tarafından ve Eşleştirme yığınlardaki bir Nihai Analiz Doğru tarafından Seth Pettie. Bu çalışmanın bir kısmını Okasaki'nin tembel eşleştirme yığınlarına uygulamak mümkün olabilir.

  • Deterministik taraflı parmak ağaçları : Önyargılı Atlama Listelerinde Amitabha Bagchi, Adam L. Buchsbaum ve Michael T. Goodrich tarafından deterministik önyargılı atlama listeleri için bir tasarım sunulur. Yukarıda belirtilen atlama listesi / ağaç dönüşümü vasıtasıyla, deterministik yanlı arama ağaçları yapmak mümkün olabilir. Birleştirilebilir sözlüklerde John Iacono ve Özgür Özkan tarafından açıklanan parmak bastırılmış atlama listeleri daha sonra taraflı atlamalı ağaçlarda mümkün olabilir. Eğimli bir parmak ağacı, Demaine ve ark. Tamamen fonksiyonel denemeler konusundaki makalelerinde (yukarıya bakın) denemelerde parmak güncellemesinde zaman ve mekan sınırlarını azaltmanın bir yolu olarak.

  • String B-Tree: Harici Hafızada String Arama ve Paolo Ferragina ve Roberto Grossi'nin Uygulamalarına Yönelik Yeni Bir Veri Yapısı , denemelerin ve B-ağaçlarının faydalarını birleştiren iyi çalışılmış bir veri yapısıdır.


5
Bu cevaptaki "topluluk wiki" kutusunu işaretlediğimi hatırlamıyorum. Bunu geri almanın bir yolu var mı?
jbapple

7
@jbapple: belirli sayıda düzenlemeden sonra, tüm gönderiler topluluk wiki olur. Bu etkileyici bir inceleme. Teşekkür ederim.
Phil Miller

29
Harika liste! Bu da beni Okasaki'nin ikinci bir baskı yayınlamasını diliyor.
Radu GRIGore

4
Isabelle / HOL'nin SML, OCaml, Haskell, Scala için kod oluşturabildiğini unutmayın. Haskabelle aracı ayrıca Haskell'i Isabelle / HOL'a aktarabilir.
Makarius

2
“Program çıkarımı” terminolojisi, Coq'dan biridir: yapıcı bir kanıt alırsınız ve ondan çalıştırılabilir bir program yaparsınız. Isabelle'de buna "kod oluşturma" denir ve ispatlar değil, HOL spesifikasyonlarını sahte kod olarak kullanarak farklı şekilde çalışır . Berghofer’a göre Isabelle / HOL’de prova çıkarımı Coq’a benziyor ancak bu günlerde nadiren kullanılıyor.
Makarius

63

Zaten yapılan mükemmel notlara, Fermuar ekleyeceğim .

Huet, Gerard. “İşlevsel İnci: Fermuar” İşlevsel Programlama Dergisi 7 (5): 549-554, Eylül 1997.

Wikipedia: Fermuar (veri yapısı)


4
Fermuarlar harika. Birçok kullanım durumu için, ağaç tabanlı gösterimlerin, başka türlü biraz daha karmaşık olacağı yerlerde birçok veri türü için "doğru" seçenek haline gelmesine izin veriyorlar
Carter Tazio Schonwald

1
XML manipülasyonu için kullanımlarına bir örnek: anti-xml.org/zippers.html
Mekanik salyangoz

40

Vay, ısrarcı bir BİRLİKTE BULUN! Teşekkürler!
jkff

3
Şey, bir nevi ... Makaleye bakın.
Radu GRIGore

1
... veya tercih ederseniz, bazı kodlara bakın (Matt Parkinson tarafından) github.com/septract/jstar/blob/master/src/utils/…
Radu GRIGore

5
Şimdi "tür .." yorumunun neden bir artığı olduğunu anladım. Yalnızca neredeyse yalnızca biri kalıcılık kullanmadığında veya her zaman geri izlemediğinde iyi performans gösterirler: sık sık hem "yeni" hem de "eski" sürümleri kullanıyorsanız, becerilirsiniz. Yine de harika bir yeniden ortaya çıkma fikri.
jkff



14

Rangemaps

Özel bir veri yapısıdır, ancak Martin Erwig'in DIET'in yerine, biraz farklı özelliklere sahip bir alternatif olarak kullanılabilir, bu nedenle en azından karşılaştırılacak bir veri yapısı vardır. DİYET, 1998'de JFP'de yayınlanan bir makalede açıklanmıştır, bu nedenle belki de Tamamen İşlevsel Veri Yapıları'na dahil edilmemiştir.


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.