Yönlendirilmemiş Bir Grafiğin En Kısa Yolu mu?


19

Bu yüzden (biraz temel olsa da) sorunun buraya ait olduğunu düşündüm:

Diyelim ki 10x10 örüntüde dizilmiş 100 nod büyüklüğünde bir grafiğim var (satranç tahtası). Grafik yönlendirilmemiştir ve ağırlıksızdır. Grafikte hareket etmek için üç boşluk ileri ve bir boşluk sağa veya sola hareket ettirilir (bir satranç şövalyesinin tahtada nasıl hareket ettiğine benzer).

Sabit bir başlangıç ​​düğümü göz önüne alındığında, tahtadaki diğer düğümlere giden en kısa yolu nasıl buluruz?

Düğümler arasında sadece canlı hareketler olan bir kenar olacağını hayal ettim. Bu nedenle, bu bilgi göz önüne alındığında, bir başlangıç ​​düğümünden bir bitiş düğümü için en kısa yolu bulmak istiyorum.

İlk düşüncem, her bir kenarın ağırlık 1 ile ağırlıklandırılmasıydı. Bununla birlikte, grafik yönlendirilmemiştir, bu nedenle Djikstras ideal bir uyum olmazdı. Bu nedenle, önce derinlik araştırmasının değiştirilmiş bir formunu kullanarak yapmaya karar verdim.

Ancak, hayatım boyunca aramayı kullanarak en kısa yolu nasıl elde edebileceğimi görselleştiremedim.

Denediğim başka bir şey, grafiği başlangıç ​​düğümü kök olarak olacak şekilde ağaç formuna koymak ve daha sonra bana istenen uç düğümü veren en sığ (en düşük satır numarası) sonucunu seçmekti ... bu işe yaradı, ancak inanılmaz derecede verimsizdi ve bu nedenle daha büyük bir grafik için işe yaramaz.

Bu konuda beni doğru yönde yönlendirebilecek herhangi bir fikri olan var mı?

Çok teşekkür ederim.

(Grafiğin görselleştirilmesini sağladım, ancak düşük itibarım nedeniyle başaramadım)

Yanıtlar:


19

Grafikteki kenarlar yalnızca belirli konumlar arasındaki geçerli hareketleri temsil ediyorsa, Dijkstra'nın kullanılması gayet iyi çalışır. Ancak, grafik ağırlıksız olduğundan aşırıya kaçar. Basit bir ilk arama en uygun cevabı verecektir.


ohhhhhh adam BFS bile düşünmedim! bir ton teşekkürler!
gfppaste

Nasıl abartılı? belki başka bir uygulama biraz daha zor olabilir.

BFS'nin daha verimli olduğunu da eklemek isterim. O(|E|)Dijkstra'nın sahip olduğu BFS vardır O(|E| + |V|log(|V|).
Doug Ramsey

@ user742 BFS, Djikstras'tan daha hızlı. Djikstra O(mn)ise BFS iseO(V + E)
CodyBugstein

13

Nicholas zaten mükemmel bir cevap verdi. Ancak, önce derinlik araması kullanma girişiminizi ele alalım.

İlk olarak, ya Dijkstra (Nicholas Mancuso tarafından belirtildiği gibi ağırlıksız düğümlerle iyi çalışır) veya en geniş ilk arama, belleğinizin üstel israfına neden olur. Bununla birlikte, avantajları, en uygun çözümleri bulmalarını garanti ederken hiçbir düğümü asla yeniden genişletmemeleridir. Ne yazık ki, sınırlamaları oldukça önemlidir ve makul bir şekilde büyümeleri beklenmemelidir.

dmbirxkbendmbirx+benxkdmbirx=k=1 çözümün derinliğinde doğrusal bellek kullanırken en uygun çözümü bulmanız garanti edilir.

Düğümleri yeniden genişletmenin oldukça kötü bir fikir olduğunu düşünüyor olabilirsiniz. Bir şey değil! Bu, doğrusal bir bellek tüketimini garanti eden şeydir, genel çalışma süresine hakim olan iterasyon sadece sonuncudur, böylece bu algoritmanın yüküne maruz kaldığı kanıtlanabilir.bb-1b

Alkış,

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.