Aufgabe:
In einem Heap mit n Datensätzen werde der Schlüssel eines beliebigen Datensatzes geändert.
Formulieren Sie einen Algorithmus mit Aufwand O(log(n)), der die Heapstruktur wieder herstellt. (Sie müssen also auch eine Aufwandsanalyse durchführen!)
Lösung:
[U]Algorithmus[/U]: Heap bearbeiten
[U]Eingabe[/U]: Zu bearbeitende Heap h, Schlüssel s des zu bearbeitenden Knotens, neuer Schlüssel t
[U]Ausgabe[/U]: Heap h
Suche Knoten n mit Schlüssel s;
Wenn Knoten n mit Schlüssel s gefunden:
Ersetze s durch t
Sonst:
Gebe aus „Zu bearbeitender Schlüssel nicht gefunden“;
Beende den Algorithmus;
Solange t kleiner als Schlüssel eines Sohnes von n
Bestimme den größeren Schlüssel g der beiden Söhne von n;
Vertausche n mit dem Sohn mit g (sift down);
Solange t größer ist als Schlüssel des Vaters
Vertausche t mir seinem Vater (sift up);
Meine erste Frage wäre, ob der Algorithmus so korrekt ist, oder ob ich etwas vergessen habe zu ebachten?
Meine zweite Frage wäre, wie ich die Aufwandsanalyse durchzuführen habe. Darin bin ich leider nicht so fit.
O(log(n)) im Worstcase ist meiner Meinung nach gegeben, da ich maximal h (Höhe) Schritte durchführen kann, indem ich entweder die kleinste Zahl ganz oben einfüge, oder die größte Zahl ganz unten. Die Höhe ist ja gleich log(n). Aber wie schreibe ich das nun mathematisch korrekt auf?