Entfernen eines Elements aus einer Prioritätswarteschlange

7

In Python bietet das heapq -Modul eine Prioritätswarteschlange.

Es hat Methoden zum Einfügen und Poppen von Elementen.

Wie entfernen Sie ein eingefügtes Element mit der niedrigsten Priorität aus der Warteschlange?

(Alternative Rezepte, die dies unter Verwendung alternativer anderer Sammlungen tun, sind ebenfalls willkommen)

    
Will 30.03.2011, 10:11
quelle

4 Antworten

11

Das Modul heapq verwendet Standard-Python-Listen als zugrunde liegende Datenstruktur. Sie können danach einfach die standardmäßige list -Methode remove() und heapify() erneut verwenden. Beachten Sie, dass dies jedoch lineare Zeit benötigt.

%Vor%

Sie können die Leistung des Heap-Vorgangs mithilfe der undokumentierten Funktion heapify._siftup() verbessern, aber der gesamte Prozess ist immer noch O (n), da list.remove() O (n) ist.

    
Sven Marnach 30.03.2011, 10:15
quelle
4

Wenn Sie den Speicherort des Elements kennen, das Sie entfernen möchten, können Sie Folgendes tun:

%Vor%

Der erste Schritt ist jetzt O (1) Zeit, und der zweite Schritt kann O (log (N)) gemacht werden, indem die undokumentierten Daten verwendet werden. Natürlich ist es immer noch O (N), k zu finden, wenn Sie es nicht schon haben.

    
Stephen 22.03.2012 03:02
quelle
3

Diese log (N) -Funktion funktioniert für mich:

%Vor%     
Marcel van Kervinck 20.01.2012 16:21
quelle
2

Es gibt eine Datenstruktur namens treap , die eine Kombination aus Warteschlange und Binärbaum darstellt. (Baum-Haufen). Es ermöglicht Log-n-Suche, die Ihnen helfen könnte.

Es gibt eine Python-Treap-Implementierung auf PyPi ..;)

    
Macke 30.03.2011 10:17
quelle

Tags und Links