In meiner Daten-Struktur natürlich muss ich mit der folgenden Zeit einen binären Heap implementieren - Komplexitätsanforderungen:Implementierung von Heap (ADT) mit Array Vs. LinkedList
- Max finden - O (1)
- Einfügen - O (lg n)
- Max löschen - O (lg n)
Jetzt dachte ich, das ein Array in der folgenden Art und Weise verwendet implementieren: die Wurzel des Haufens ist in Arr [1] (dem ersten Index). Die Kinder von Arr [i] sind in Arr [2i] und Arr [2i + 1] (2 Kinder). Mit dieser Implementierung bekomme ich Find Max in O (1), Löschen Max in O (n) und Einfügen in O (lg n) mit einer Ausnahme - wenn ich einfügen muss, wenn das Array voll ist, muss ich die Größe ändern Array und "kostet" mich O (n), so dass die Gesamtkosten des Einfügens mit allen Randfällen O (n) anstelle von O (log n) wie erforderlich sein wird.
Gibt es eine andere Art der Implementierung, die alle komplexen Anforderungen erfüllt? Ich dachte vielleicht zu versuchen, mit einer LinkedList anstelle eines Arrays zu implementieren, aber einfügen wird immer noch O (n). Vorschläge für eine Implementierung sind sehr willkommen.
Danke eigentlich wollte ich schreiben, dass "delete max" ist O (log n) mit der 'schwimmen' Technik, die Sie erwähnten. Mein Problem ist mit der Einfügung - ich weiß, dass die amortisierte Laufzeit O ist (log n), aber ich brauche die Worst-Case-Laufzeit O (log n) und was mich denken lässt, dass ich diesen Heap vielleicht nicht mit Array implementieren sollte aber auf eine andere Weise ... – Noam
Ok ich sehe. Ein Gedanke aus dem Wikipedia-Artikel * Die Motivation für eine amortisierte Analyse ist, dass die Worst-Case-Laufzeit pro Operation zu pessimistisch sein kann *. Ich denke du hast die richtige Umsetzung. Siehe [dieser PowerPoint] (http://algs4.cs.princeton.edu/lectures/24PriorityQueues.pdf). Ihre aktuelle Implementierung wird immer noch als O (lgn) betrachtet. –
In Ordnung. also lasse ich die Implementierung so protzig. Danke – Noam