2009-04-10 16 views
6

Neden en öncelikli/yığın kuyruklar 0 en yüksek önceliği olarak uygulanmaktadır? Anahtar matematiksel ilkeyi kaçırdığımı farz ediyorum. Önceleri kendi önceliğim sırasını uygularken önceliğin tamsayı değeriyle artması durumunda ekleme işlevinin yazılması daha kolay görünüyordu, ancak görünüşe göre benden daha zeki insanlar, başka yöne gitmesi gerektiğini düşünüyorlar.Öncelikli sıralar çoğunlukla en önemli öncelik olarak 0 kullanıyor?

Herhangi bir fikrin var mı?

cevap

13

En öncelikli kuyruklar benzer bir fibonacci heap falan olarak uygulanır. Bu veri yapısı, asgari süreyi sabit bir zamanda ayıklamayı destekler, bu da en yüksek önceliği 0 yapmanın doğal olmasını ve asgari miktarın çıkarılmasıyla kuyruğun dışına çıkar.

+0

yeni bir şey öğrendim. Teşekkürler! –

+0

Bu yanıltıcıdır: Destek hakkında duyduğum bütün yığınlar * sabit zamanda minimum belirleme *; ancak * minimum elemanın çıkarılması (böylece ikinci en küçük elemanın yeni minimum haline gelmesine neden olmak) daima “O (log (n))' zamanını gerektirir. Bu oldukça temeldir; aksi halde, o yığının bir "O (n)" sıralama algoritması yapmak için kullanabilirsiniz. Bir fibonacci yığınının performans avantajları (basit ikili yığın üzerinde), diğer iki operasyonda değil, diğer operasyonlardadır. –

+1

Ayrıca, bu cevap bile soruya cevap vermiyor! Fibonnacci yığınları maksimum süreyi sabit zamanda da destekleyebilir - sadece bir kongre. –

2

bunun için herhangi bir tasarım neden yok sanmıyorum. Muhtemelen programcıların çoğu ilk eleman olarak 0 düşünmek için kullanılır. enumerator'lerin hiç en yüksek önceliğe, nasıl hiç hiçbir şeyi artıyor Öyleyse ilk tanımlanmış enum "En Yüksek" tamsayı değeri 0.

6

olacak 0'dan başladığı çünkü diğer nedeni olabilir? yani STL en std::priority_queue, top() eleman göre sayısal olarak bir en yüksek olduğunu kullanılmadığı takdirde mutlaka en hazır biri ne rossfab cevabı :) kar¸ıt olarak

2

için (1() öncelikli kuyruk uygulamaları, operator<. Tabii ki herkes sırayla ön sıradaki sıralama düzenine alışkındır, bu yüzden ilk kez kullandıklarında pek çok insanı yakalar.

4

Bunun nedeni genellikle, öncelik sıralarının düğüme olan uzaklığı ve önce daha yakın düğümleri işlemek istediğiniz Dijkstra ve A * gibi algoritmaları uygulamak için öncelik sıralarının kullanılmasıdır.

0

0 öncelikli için daha iyi bir seçim yapar bir öncelik sırası hakkındaki doğasında bir şey yoktur. Bununla birlikte, yeniden kullanılabilir bir uygulama yazarken, bir şey seçmeniz gerekecek ve önceliğiniz için kullandığınız tümleşik veya kayan nokta değeri ne olursa olsun 0 iyi tanımlanmış olacaktır.

Özel bir uygulamada bile, yalnızca 256 öncelik düzeyine gereksiniminiz olduğuna ve öncelik olarak imzasız bir karakter kullanmanıza ve 255 en yüksek önceliğinize sahip olmanıza karar verirseniz, karar verirseniz tüm kodunuzu dikkatli bir şekilde gözden geçirmeniz gerekir. Daha fazla seviyeye ihtiyacın var.