2016-04-15 13 views
0

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.

Antwort

1

Ihre Implementierung kann die Anforderungen erfüllen. Ich nehme an, dass, wenn Sie sagen, delete max nimmt O (n), Sie denken, dass Sie das gesamte Array über eine Position verschieben müssen? Was Sie in diesem Fall tatsächlich tun müssen, ist, haben Sie das nächste größte Element "schwimmen" an die Spitze, wie sie sagen. Dies erfordert nur O (lgn) Zeit.

Auch die Größenänderung passiert nicht oft, so dass die amortisiert Laufzeit ist immer noch O (lgn). See here.

+0

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

+0

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. –

+0

In Ordnung. also lasse ich die Implementierung so protzig. Danke – Noam