Mein 8-Jähriger hat sich gelangweilt, konventionelle Labyrinthe zu erstellen, und hat Varianten entwickelt, die so aussehen:
Die Idee ist, mit x zu beginnen und über die normalen Regeln nach o zu gelangen. Außerdem können Sie von einer beliebigen Ganzzahl zu einer beliebigen anderen Ganzzahl "springen" , müssen jedoch bezahlen Dollar für das Privileg. Das Ziel ist es, das Labyrinth mit den geringsten Kosten zu lösen. Im obigen Beispiel könnten wir von x nach o über x-14-18-27-28-o zu Kosten von 5 gehen, aber es ist billiger, nur für x-13-11-9-8-29-28-o zu gehen 4.
Hier ist meine Frage: Was ist die beste Lösung (in Bezug auf die asymptotische Laufzeit), die Sie zur Lösung dieses Problems finden können? Sie können vernünftige Annahmen über das Eingabeformat treffen.
Hinweis: Ich verwende hier das "Puzzles" -Tag, weil ich eine -Antwort im Auge habe, aber ich bin mir nicht sicher, ob es optimal ist, und möchte sehen, ob jemand anderes meine Lösung verbessern kann. (Hier ist die Anzahl der ganzen Zahlen im Labyrinth.)
Antworten:
Sie können dies mit einer Variation des Dijkstra-Algorithmus in lösen . Es kann passieren, dass wir nicht alle Entfernungsaktualisierungen durchführen, wenn wir einen neuen Knoten besuchen. Wenn wir einen Knoten y besuchen , müssen wir nur die Entfernungen von allem, was von y nach 0 gehen kann, aktualisieren und die Entfernungen zu den beiden Knoten y - und y + mit den nächstgelegenen Werten für y, die kleiner und größer als y sind , aktualisieren wurde noch abgeholt.O(nlogn) y y y− y+ y y
Diese Aktualisierungen reichen aus, um zu gewährleisten, dass der Heap das minimale Element zurückgibt, da jeder nächste Knoten, zu dem Sie springen, numerisch direkt über oder direkt unter einem bereits besuchten Knoten liegen muss.
Jeder Knoten wird höchstens einmal auf 0 aktualisiert (wenn alle Knoten ohne Abstand aus der Warteschlange entfernt werden, um ein quadratisches Verhalten zu vermeiden), und jedes Mal, wenn wir einen Knoten hinzufügen, werden nur O (1) andere Aktualisierungen durchgeführt. Das Ermitteln der Werte und y + kann in linearer Zeit erfolgen, wenn wir auch eine geordnete doppelt verknüpfte Liste aller Knoten führen, sortiert nach ihren ganzzahligen Werten. Das Erstellen dieser doppelt verknüpften Liste dauert O ( n log n ) , und schließlich dauert das Aktualisieren von O ( n ) und das Abrufen vom Heap O ( n log n ) für eine Gesamtlaufzeit von O (y− y+ O(nlogn) O(n) O(nlogn) O(nlogn)
quelle
Es erscheint natürlich, dies mit einem speziellen Startknoten (x) und Endknoten (0) in das Problem des kürzesten Pfades umzuwandeln. Es würde auch einen anderen Knoten für jede der Nummern geben. Sowohl x als auch 0 haben Kanten der Gewichtung 0 für alle im Labyrinth erreichbaren Nummernknoten. Alle Nummernknoten sind entweder mit dem Gewicht 0 (wenn die Nummern im Labyrinth erreichbar sind) oder mit der Differenz zwischen den Nummern (wenn nicht im Labyrinth erreichbar) verbunden.
quelle