2013-02-19 30 views
5

Dijkstra'nın algoritması uygulamasında tüm düğümlerle 1 dizi ve tüm düğümlerle 1 öncelik sırası var. Bir düğüm devreden çıkarıldığında, tüm bitişik düğümleri yeni mesafeyle ve nereden geldiğini günceller, böylece yolu yeniden izleyebilirim.Dijkstra'nın öncelik sırasına göre algoritması

öncelik kuyruğundaki düğüm yeni mesafe ile güncellenir ve ondan yeni bir mesafede geldiği dizide düğüm güncellenir. Bir düğüm dequeued edildiğinde dizideki son mesafesi güncellenir:

PathInfo current = pq.remove(); 
    path[current.pos].distance = current.distance; 

önceki düğüm ve mesafe ile öncelikli sırası hakkındaki bilgilerle diziyi hem güncellemek için kabul edilebilir mi?

Bu, daha iyi bir mesafe olan her durumda olur:

 PathInfo key(i, newDistance); 
     path[i].distance = newDistance; 
     path[i].previous = current.pos; 
     pq.decreaseKey(key); 

gereksiz biraz temelde aynı bilgi ile benim dizi ve öncelikli sırayı güncellemek gibi görünüyor.

Şu anda PQ bir veri yapısı olarak düzenli bir dizi kullanıyorum. Önceliğin güncellenmesi doğrusal zamanda yapılır ve dequeueing de doğrusal zamanda yapılır. Öncelikli kuyruğunda kullanmalı ve nasıl bir düğümleri öncelik değiştirmek gerekenler veri yapısı

? Ben kullanabilir C++

cevap

1

Burada iki tür uzaklık vardır: öncelik sıranızda "geçici uzaklıklar" bulunur. dizininiz "son mesafelere" sahipken güncellenmeyebilir, çünkü (Dijkstra'nın algoritmasının öncelik sırasından kaldırılan düğümleri güncellemesine gerek yoktur).

gereksiz yere dizideki mesafeleri güncelliyoruz anlaşılmaktadır. Belki de, bunu dizmek için dizi düğümünüzdeki alan adını değiştirmek iyi bir fikir olacaktır: arrayNode.distance'dan arrayNode.finalDistance'a.

Başka bir deyişle: Dijkstra'nın algoritmanızdaki sonuçları çıkarmak için dizi düğümlerinizi kullanıyorsunuz - bu nedenle, her sıra düğümündeki mesafeyi, öncelik sırasından kaldırıldığında yalnızca bir kez ayarlamanız gerekir.


Önceliğiniz-kuyruk uygulaması, belirli bir anahtarla ilişkili cari mesafe sorgulama yeteneği sağlamıyorsa, onun decreaseKey() operasyonun davranışını kontrol edin. decreaseKey() işlemi, yeni önceliğin gerçekten azaltılmayacağı güncellemeleri reddederse, bu kontrolü kendiniz gerçekleştirmeniz gerekmemelidir - sadece geçerli düğümdeki her bir komşu için bunu çağırabilirsiniz.

Ancak, decreaseKey() işlevi bu durumu doğru şekilde işlemezse ve bu denetimi el ile gerçekleştirmenize izin verecek yardımcı bir sorgulama işlevi bulunmadığında ve eksiklikleri düzeltmek için herhangi bir fırsat yoksa, bakımını yapmanız gerekir. Bu amaç için gereksiz bilgi ....

+0

Dizideki mesafeleri güncellemeliyim. PQ'mdan gelen düğüm, bitişik düğümlere daha iyi bir mesafe verebilirse nasıl karşılaştırmalıyım? – Carlj901

+0

İdeal olarak, PQ'nuzdan bakabilmeniz gerekir. Bu işlem kullanılamıyorsa (ve PQ uygulamanıza eklenemiyorsa), gereksiz bilgileri korumanız gerekecektir. [Bu cevabımı bir cevaba ekleyeceğim] – comingstorm

+0

En çok tercih edilen, PQ'mda bir yığın tutabilseydim ve her düğüm adını (2B dizisindeki konum) mesafeli olarak eşleyen bir karma işlevine sahip olsaydım olurdu. Bunu nasıl uygulayacağımı bilmiyorum. – Carlj901

0

Veri yapıları kullanıyorum

: Belki başka

dizideki asgari bulmak için. Eğer preffer hangi veri tipleri de senkronize olmalıdır da sizi düğüm öncelik güncellemek

.

Not: bağlı düğüm kontrol etmek için bir matris kullanılır Eğer yine de O olacaktır algo karmaşıklığı değişmez olarak, sadece veri yapısı kullanamaz (N^2) (uygun öncelikli düğüm bulmak için doğrudan döngüsü kullanımı) Grafikte çok fazla düğüm ve az miktarda bağlantı olduğunda veri yapısı etkilidir ve bağlı düğümlerin listesi olarak kaydedilir (boşaltılan grafikler)

+0

Bir yığındaki düğüm önceliklerini nasıl güncelleştiririm? – Carlj901

+0

Bağlantıları düğüm içindeki düğümlere depolamalı ve düğümler yığın içinde "hareket ettiğinde" bu bağlantıları eşitlemelisiniz. –

İlgili konular