Dekrementierungsschlüssel mit STL-Heap in O (logn) -Zeit implementieren

8

Momentan unterstützt STL Heap den Verkleinerungsschlüssel nicht, jedoch kann man einfach den Wert des Vektors direkt ändern und make_heap erneut aufrufen, was O (n) Zeit ist. Dies ist jedoch nicht so effizient wie ein binärer Heap-Verkleinerungsschlüssel, der eine O (Logn) -Zeit benötigt.

Gibt es eine Möglichkeit, O (logn) -Zeit mit STL-Heap-Funktionen zu erreichen?

    
Jake 24.03.2012, 06:49
quelle

2 Antworten

3

Ich bin mir ziemlich sicher, dass es keine standardkonforme Methode dafür gibt - Wikipedia sagt das auch :

  

Es gibt keine Standardunterstützung für die Funktion zum Verkleinern / Vergrößern von Tasten

Obwohl es weiterhin auf die gheap -Bibliothek verweist, die einen Blick wert sein könnte.

Das Problem hierbei ist, dass der Standard nicht vorschreibt, wie die Heap-Struktur aussieht und wie genau die Operationen ausgeführt werden. (Im Allgemeinen ist das eine gute Sache.)

Wenn die Implementierung einen Standard-Binary-Heap verwendet, dann können Sie das Element einfach auf heap[i] reduzieren und dann push_heap(heap.begin(), heap.begin() + i + 1) aufrufen, wodurch die erforderliche Up-Heap-Operation ausgeführt wird. Das Element, das an der Position i endet, darf nicht größer als der ursprüngliche Wert sein. Daher wird die Heap-Eigenschaft des gesamten Heapspeichers beibehalten. Aber dies wird vom Standard nicht unterstützt, auch wenn es manchmal in einigen Implementierungen funktioniert.

    
Alan Stokes 28.03.2012 20:21
quelle
1

Sie können pop_heap verwenden und anschließend den Wert dekrementieren, gefolgt von push_heap :

%Vor%

EDIT: Ist das was du meinst, oder willst du den Schlüssel von irgendeinem Element im Heap verkleinern können?

    
Mankarse 24.03.2012 07:00
quelle

Tags und Links