Iterieren über eine Priority-Queue, in Python?
Ich versuche zu implementieren, die Uniform-cost-Suche in python und dafür brauche ich eine priority-queue, die ich bin mit queue.py aus der standard-Bibliothek. Aber das Ende des Algorithmus überprüft, ob es irgendeinen Pfad mit höheren Kosten in der Warteschlange. Wie kann ich prüfen, ob es nicht einen beliebigen Wert in meiner Warteschlange, wenn es nicht durchsuchbar?
Dank
- Ich würde empfehlen, das schreiben Ihrer eigenen Priorität-Warteschlange verwenden einfach eine einfache
list
undheapq
. Es ist nicht so schlimm. Siehe die implementation notes in der heapq docs. - Das ist genau wie
queue.PriorityQueue
umgesetzt wird 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
queue.PriorityQueue
tatsächlich umgesetzt wird mit einemlist
, und dieput
/get
Methoden verwendenheapq.heappush
/heapq.heappop
zur Aufrechterhaltung der Priorität der Reihenfolge in daslist
. Also, wenn Sie wollten, könnten Sie einfach Durchlaufen der internen Liste, die enthalten ist in derqueue
Attribut:Den
PriorityQueue
implementiert binary heap, die umgesetzt wird mit einemlist
(array) in python. Die zum Durchlaufen der Warteschlange müssen Sie wissen, die Regeln darüber, wo Kinder sind gespeichert in der Liste.Die Regeln, dass alle Knoten haben zwei Kinder, es sei denn, Sie sind der Letzte Knoten haben Kinder in welchem Fall Sie möglicherweise haben ein Kind, statt. Alle Knoten, die sich nach dem letzten Knoten die Kinder haben keine Kinder (duh).
Die untergeordneten Knoten eines Knotens gespeichert werden, in Bezug auf die Knoten die eigene position in der Liste. Wo
i
ist der index der Knoten in die Liste ein dann sind es die Kinder sind gespeichert unter:2 * i + 1
2 * i + 2
Jedoch nur die Voraussetzung für einen heap ist, dass alle Knoten, die Kinder haben einen Wert, der größer als oder gleich des Knotens Wert (oder größer je nach Implementierung).
Beispielsweise in der oben verlinkten wiki-Seite über binrary heap findest du Folgendes Bild. Das erste Element in der queue ist die Wurzel. Ganz offensichtlich ist. Das zweite Element ist die größere der root-Kinder. Das Dritte Element könnte entweder werden die verbleibenden Knoten des root-Knotens, oder eines der Kinder des zweiten Knotens in die Warteschlange. Das ist, das Dritte Element in der Warteschlange (25) hätte in der gleichen position entweder 19 oder 1.
Damit die zum Durchlaufen der Warteschlange, die Sie benötigen, um zu halten verfolgen von alle der aktuell "sichtbaren" Knoten. Zum Beispiel:
Ist die Methode monkey gepatcht auf
queue.PriorityQueue
wenn du bist Gefühl faul, aber ich möchte Sie ermutigen, um Ihre eigenen priority-queue-Klasse, die mit derheapq
Modul wie diePriorityQueue
kommt mit einer Menge von überschüssigen Funktionen (vor allem ist es thread-sicher, die fast sicher nicht brauchen). Es sollte angemerkt werden, dass die oben genannte Methode ist nicht thread-sicher. Wenn ein anderer thread ändert die Warteschlange, während es über die iteriert dann über die oben genannte Methode wird gestartet, woraus sich die falsche zahlen und wenn man Glück hat, kann es eine Ausnahme erzeugen.Es sei denn, Sie brauchen die thread-Sicherheit, die
queue.queue
gibt, wie es war vor allem gedacht als ein thread-sicherer job-Warteschlange und nicht als eine Allgemeine Warteschlange, könnten Sie besser dran mit einemSammlungen.deque
direkt, wie Sie sind durchsuchbar.