Wie kann ich eine eindeutige Wertprioritätswarteschlange in Python erstellen?

8

Python hat Queue.PriorityQueue, aber ich kann keine Möglichkeit sehen, jeden Wert darin einzigartig zu machen, da es keine Methode gibt, um zu überprüfen, ob ein Wert bereits existiert (wie find (name) oder ähnliches). Darüber hinaus benötigt PriorityQueue die Priorität, um innerhalb des Wertes zu bleiben, so dass ich nicht einmal nach meinem Wert suchen konnte, da ich auch die Priorität kennen müsste. Sie würden (0,5, myvalue) als Wert in PriorityQueue verwenden und dann nach dem ersten Element des Tupels sortieren.

Die Klasse collections.deque hingegen bietet eine Funktion zur Überprüfung, ob ein Wert bereits existiert und noch natürlicher in der Verwendung ist (ohne Sperre, aber immer noch atomar), aber es bietet keine Möglichkeit, nach Priorität zu sortieren .

Es gibt einige andere Implementierungen in stackoverflow mit heapq, aber heapq verwendet auch die Priorität innerhalb des Wertes (z. B. an der ersten Position eines Tupels), so dass es für einen Vergleich bereits existierender Werte nicht gut zu sein scheint.

Erstellen einer Python-Prioritätswarteschlange

Ссылка

Was ist der beste Weg, um eine atomare Prioritätswarteschlange (= kann von mehreren Threads verwendet werden) mit eindeutigen Werten zu erstellen?

Beispiel, was ich hinzufügen möchte:

  • Priorität: 0.2, Wert: Wert1
  • Priorität: 0.3, Wert: Wert2
  • Priorität: 0.1, Wert: Wert3 (wird zuerst automatisch abgerufen)
  • Priorität: 0.4, Wert: Wert1 (darf nicht erneut hinzugefügt werden, obwohl er eine andere Priorität hat)
Aufziehvogel 13.05.2011, 20:05
quelle

3 Antworten

7

Sie könnten eine Prioritätswarteschlange mit einer Menge kombinieren:

%Vor%

Dies verwendet die in einer Ihrer verknüpften Fragen angegebene Prioritätswarteschlange. Ich weiß nicht, ob das das ist, was Sie wollen, aber es ist ziemlich einfach, auf diese Weise ein Set zu einer beliebigen Art von Queue hinzuzufügen.

    
Boaz Yaniv 13.05.2011, 20:29
quelle
2

Nun, hier ist ein Weg, es zu tun. Ich habe im Grunde damit begonnen, wie sie PriorityQueue in Queue.py definiert und einen Satz hinzugefügt, um eindeutige Schlüssel zu verfolgen:

%Vor%

Boaz Yaniv hat mich um ein paar Minuten geschlagen, aber ich dachte, ich würde auch meine veröffentlichen, da es die volle Schnittstelle von PriorityQueue unterstützt. Ich habe einige print-Anweisungen unkommentiert gelassen, aber die, die ich beim Debuggen eingegeben habe, kommentiert. ;)

    
John Gaines Jr. 13.05.2011 20:38
quelle
0

Wenn Sie eine Aufgabe später priorisieren möchten.

%Vor%

Hier ist eine weitere Implementierung folgt dem offiziellen Leitfaden:

%Vor%     
colinfang 22.02.2017 12:38
quelle

Tags und Links