Çoğu dil neden maks-yığın uygulaması yerine bir min-yığın sağlar?


19

Sadece bir şey fark ettim ve bunun bir nedeni olup olmadığını merak ediyorum. C ++ (std :: öncelik_queue bir max yığın) dışında, max yığın sunan başka bir dil bilmiyorum.

Python'un heapq modülü, listenin üzerine ikili bir min-yığın uygular.

Java'nın kitaplığı, bir min-öncelik sırası uygulayan bir PriorityQueue sınıfı içerir.

Go'nun kitaplığı, herhangi bir uyumlu veri yapısının üstüne bir min-yığın uygulayan bir kap / yığın modülü içerir.

Apple'ın Core Foundation çerçevesi, bir min yığın uygulayan bir CFBinaryHeap yapısı içerir.

Bir max-yığınını bir min-yığınından daha sezgisel buluyorum ve teknik olarak uygulama farkının sadece bir karşılaştırma operatörünü değiştirme sorunu olduğuna inanıyorum. Gerçek bir sebebi var mı? Çoğu uygulama max yığın yerine bir min gerekir? Şimdiden teşekkürler


Tam olarak aynı şey değil mi? Tartışmacı olarak kapatmak için oy kullanıyorum.

2
Sadece birkaç gün önce C ++ 'ta bir min yığın gerekiyordu ve bu biraz default_queue bir max yığın varsayılan rahatsız oldu. Önceden işleci olan özel sınıfımda işleci> tanımlamam beni zorladı. Grafiklerle çalışırken, genellikle en kısa kenarlara öncelik vermek istersiniz, bu nedenle min yığınına ihtiyacınız vardır.
LaC

2
@LaC: kullanabilirsiniz std::not2(std::less<T>()).

Yanıtlar:


9

Diğerlerinin de gözlemlediği gibi, öbek bir karşılaştırıcıyı kabul ederse, o zaman bir davranış veya diğeri almak çok zor değildir. Bununla birlikte, Google Kodunun hızlı bir şekilde incelenmesi, tekrar tekrar gelen iki uygulama nedeniyle min-yığının gerçek kodda çok daha yaygın olduğunu göstermektedir.

  • Dijkstra / A * / diğer birçok kısa yol algoritması (kısmi yollar uzadığından).

  • Etkinlik simülasyonu (çünkü zaman ilerliyor).

Ayrıca, varsayılan sıralama küçükten büyüğe öğeleri döndürdüğü için, varsayılan öbeği olması gerektiğini iddia ediyorum.


2
Genellikle C ++ program ve tam tersi: C ++ neden bir min-yığın uygulamak değil? Söylediğiniz gibi, çoğu algoritma bir min-yığın kullanır.
Martín Fixman

5

Bu sadece bir zevk meselesi. Bunun özel bir nedeni olacağını sanmıyorum. Tıpkı bazı insanlar problemleri optimize etmenin maliyeti en aza indirmeyi ifade etmeyi severken, diğerleri ise karı maksimize etmeyi sever.


3

Bildiğim çoğu dil, bir min veya max-yığın olup olmadığına karar vermek için bir parametre geçirmeye izin veriyor. Yani varsayılan değer biraz keyfi. Sanırım çoğu dil için varsayılan operatörün ne olduğunu tanımlamak bir tutarlılık meselesidir. Stl C ++ için varsayılan std::lessbir min-yığın yol açar.

std::lessVarsayılan olarak her yerde kullanmanın tutarlılığı, bu karşılaştırmayı yalnızca herhangi bir veri yapısı kullanırken uygulamanız gerektiği ve daha sonra sınıflarınızı tasarlarken hangi veri yapısını kullanacağınıza karar vermeniz gerekmediği anlamına gelir. Sanırım tek farkı olan diğer diller için aynı şey daha büyük bir karşılaştırma standardıdır.


3
Böyle bir bağlantı olduğunu sanmıyorum. <Veya> kullanarak her iki yığını da uygulayabilirsiniz. Aslında, std :: less, STL'de varsayılan değerdir, ancak min yığını yerine bir max yığını uygularlar.
LaC

1

Temel olarak, dizin değeri isteğe bağlı bir sayıdır. Sayının bir önceliği temsil ettiğini ve daha büyük sayıların daha yüksek öncelikler olduğunu düşünüyorsanız, bir maks-yığın mantıklıdır. Ancak sayılar, örneğin kavramsal fırıncılık numaralarını ("bir sayı al") temsil ediyorsa, min-yığın daha anlamlı olur.

Dizinin 1'in tamamlayıcısını alarak her zaman birinden diğerine dönüştürebilirsiniz.

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.