Haskell Öncelik Sırası uygulamalarının karşılaştırılması
Birkaç öncelik sırası uygulamaları Haskell için off-the-raf kullanılabilir gibi görünüyor. Örneğin, var:
- Veri.PriorityQueue.FingerTree (hackage fingertree-0.0.1.0)
- Veri.PurePriorityQueue (hackage pure-priority-queue-0.14)
kuyruk veri yapıları saf öncelikli olarak görünür. Eski parmak ağaçları, aşina olduğum bir veri yapısı üzerine kuruludur; ikincisi Veri etrafında sarıcı.Göster. Orada da
- Veri.Yığın (hackage heap-1.0.0)
hangi basit bir öncelik sırası yapabilir tamamen işlevsel bir yığın veri yapılarını tanımlar. . Orada olduğunu da
- Veri.Yığın (hackage heaps-0.2)
- Veri.MeldableHeap (hackage meldable-heap-2.0.3)
her ikisi de tamamen işlevsel meldable kümeler inandığım Brodal/Okasaki veri yapısı kullanılarak yürütülmesi olmayan saf fonksiyonel topraklarda binom yığın veri yapısı benzerdir.
(Oh, ve de var
- Veri.PriorityQueue öncelik sırası-0.2.2 hackage üzerinde ()
benim için belirsiz olan, ama bina ile ilgili öncelikli kuyruk Veri üzerine inşa edilmiş gibi görünüyor bir monad ve bağlı gibi görünüyor.Göster nasıl olsa. Bu soru, tamamen işlevsel öncelik sırası ile ilgileniyorum, öncelik sırası-0.2.2 paketi alakasız olduğunu düşünüyorum. Ama eğer yanılıyorsam beni düzeltin!)
Kuyruk veri yapısı inşa ediyorum saf fonksiyonel bir öncelik ihtiyacım var. Eğer herkes ben karar veririm gibi bilgelik herhangi bir kelime embarrassment of riches hackage tarafından sağlanan arasında bulunur diye merak ediyordum. Özellikle:
- Apart geleneksel öncelik sırası ekleme özellikleri ve Özü-min operasyonlar, tamamen işlevsel/değişmez bir sunum yapmak istiyorum varsayalım. Paketler, yukarıda belirtilen artıları ve eksileri nelerdir? Herkes onlardan birini kullanan var mı 'öfke'? Performans artıları ve eksileri nelerdir? Güvenilirlik? Daha yaygın olarak başkaları tarafından kullanılan? (Kullananlar kütüphane aşina olmak için daha muhtemel olacaktır beri kodum Diğerleri okumak için daha kolay olabilir.) Aralarında bir karar vermeden önce Bilmem Gereken başka şeyler var mı?
- Eğer ben de eğer verimli öncelik sırası birleştirilmesi istiyorsan, o zaman ne olacak? (Bu proje için bilmiyorum ama bu ama bu KADAR soru gelecek okuyucular için daha faydalı olur eklemeyi düşündüm.)
- Dışarıda kaçırdığım başka bir öncelik sırası paketleri var mı?
CEVAP
Öncelik sırası uygulamaları bir bolluk hackage, sadece listenizi tamamlamak için bulunabilir
- http://hackage.haskell.org/package/PSQueue
- http://hackage.haskell.org/package/pqueue
- http://hackage.haskell.org/package/queuelike
- http://hackage.haskell.org/package/priority-queue
- http://hackage.haskell.org/package/pure-priority-queue
- http://hackage.haskell.org/package/fingertree-psqueue
O PSQueue özellikle hoş bir arayüzü var. İlk uygulamalarından biri olduğunu ve güzel Ralf Hinze tarafından this paper kaplı sanırım. En verimli ve eksiksiz şekilde uygulanmasını olmayabilir ama şu ana kadar bütün ihtiyaçlarımı yapmıştır.
Bu MonadReader (issue 16) Louis Wassermann tarafından da pqueue paket yazmıştı (kim) çok iyi bir makale var. Yazısında Louis farklı öncelik sırası uygulamaları sunar ve ayrıca her biri için algoritmik karmaşıklığı içerir.
Bazı öncelik sırası iç sadeliği çarpıcı bir örnek olarak serin küçük bazı uygulamaları içerir. En sevdiğim (yazısında alınan):
data SkewHeap a = Empty | SkewNode a (SkewHeap a) (SkewHeap a) deriving (Show)
( ) :: Ord a => SkewHeap a -> SkewHeap a -> SkewHeap a
heap1@(SkewNode x1 l1 r1) heap2@(SkewNode x2 l2 r2)
| x1 <= x2 = SkewNode x1 (heap2 r1) l1
| otherwise = SkewNode x2 (heap1 r2) l2
Empty heap = heap
heap Empty = heap
extractMin Empty = Nothing
extractMin (SkewNode x l r ) = Just (x , l r )
Küçük, güzel bir uygulama...kısa bir kullanım örneği:
test = foldl (\acc x->acc x) Empty nodes
where nodes = map (\x-> SkewNode x Empty Empty) [3,5,1,9,7,2]
Öncelik sırası uygulamalarında bazı kriterler here ve *21 haskell.org * çok ilginç thread bulunabilir.
Öncelik sırası .Net...
Haskell içinde Comonad bu typeclass ne...
Haskell kayıt sözdizimi...
Ünlem işareti Haskell bildiriminde anl...
Haskell içinde üs...