Gibt es eine Möglichkeit, PHPs SplHeap neu berechnen zu lassen? (aka: Add-Heap zu SplHeap?)

8

Ich verwende ein SplHeap , um Diagrammknoten eines Baumes mit gerichteten Kanten zu halten, die von den Blättern zum Stamm durchlaufen werden . Dazu berechne ich die "fan-in" von Knoten voraus und lege sie in den Heap, so dass ich immer den Knoten mit dem kleinsten Fan-In (0) daraus finden kann.

Nach dem Besuch eines Knotens reduziere ich das Fan-In seines Nachfolgers um 1. Dann muss natürlich der Heap neu berechnet werden, weil der Nachfolger dort an der falschen Stelle ist. Ich habe versucht recoverFromCorruption() , aber es tut nichts und hält den Haufen in der falschen Reihenfolge (Knoten mit größeren fanIn bleibt vor kleineren fanIn ).

Als Workaround erstelle ich jetzt nach jedem Besuch einen neuen Heap, der jedesmal eine vollständige O (N * log (N)) Sortierung ergibt.

Es sollte jedoch möglich sein, Heap-Operationen für den geänderten Heap-Eintrag durchzuführen, bis er sich in O (log (N)) an der richtigen Position befindet.

Die API für SplHeap erwähnt keinen Up-Heap (oder das Löschen eines beliebigen Elements - es könnte dann wieder hinzugefügt werden). Kann ich irgendwie eine Klasse von SplHeap ableiten oder muss ich einen reinen PHP-Heap von Grund auf neu erstellen?

BEARBEITEN : Codebeispiel:

%Vor%

Vollständiger Code auch verfügbar: Ссылка

BEARBEITEN 2 :

%Vor%

Dies bedeutet, dass Benutzer 1 und Benutzer 3 für Benutzer 2 und Benutzer 2 für die Abstimmung stimmen Benutzer 4 , übergibt 3 Stimmen (2 erhalten + eigene). Das nennt man delegatives Voting: Mein Algorithmus gibt die Stimmen "von unten" (die Blätter) weiter, wo ich bereits weiß, wie viel Gewicht (Verantwortung / Repräsentation / wie es dir gefällt ...) jeder Nutzer hat.

    
cidermole 09.11.2012, 09:42
quelle

2 Antworten

1

Ich habe kürzlich ein sehr ähnliches Problem gelöst, es scheint, als ob SPL keine Updates unterstützt. Also

Ich musste meinen eigenen Haufen schreiben.

Es ist nicht besonders effizient, aber es tut, was ich brauche, und es ist viel schneller als ein Array wiederholt zu sortieren ... SPL-Heap ist immer noch viel schneller, obwohl ...

hier ist es ...

%Vor%

und Ergebnis ist:

  

STATISTIKEN: nach dem Einfügen von eins nach dem anderen ... Sift-ups: 22651 Sift-downs: 0 Swaps: 12651
STATISTIKEN: nach dem Extrahieren aller Wurzeln (wie in Heapsort) ... Sifts: 0 Sift-downs: 116737 Swaps: 116737
Heap ist leer. Versuchen wir ganze Reihe auf einmal
STATS: nach heapify ... Sift-ups: 0 Sift-downs: 12396 Swaps: 7396
lassen Sie uns zwei Indizes aktualisieren STATS: nach dem Update ... Sift-ups: 11 Sift-Downs: 1 Swaps: 10
STATS: nach Update ... Sifts: 13 Sifts: 1 Swaps: 12
extrahieren größten drei Indizes
44444 - das sollte 44444 sein
40000 - dies sollte 40000 bis 1000 sein - dies sollte die größte Zahl sein, die von rand (1,1000) gegeben wird. STATISTIKEN: nach drei Auszügen ... Siebener: 0 Siebener: 42 Tauschen: 42 < STATS: nach dem Extrahieren des Rests ... Siebener: 0 Siebener: 116652 Tauschen: 116652

Sie müssen es ein wenig ändern, aber trotzdem, hoffe es hilft ..

    
enrey 18.11.2012, 22:18
quelle
1

Können Sie den aktualisierten Knoten nicht einfach erneut einfügen, nachdem Sie den Wert geändert haben?

%Vor%

Erzwingt keine Umsortierung des Heaps? Das wird eine niedrigere Reihenfolge als das Erstellen eines neuen.

    
Andrew 13.11.2012 16:56
quelle

Tags und Links