Wie ist make_heap in C ++ implementiert, um eine Komplexität von 3N zu haben?

8

Ich frage mich, was ist der Algorithmus von make_heap in C ++, so dass die Komplexität 3 * N ist? Nur die Art und Weise, wie ich einen Heap durch Einfügung von Elementen erzeugen kann, hat eine Komplexität von O (N Log N). Vielen Dank!

    
Frederick Zhao 20.02.2011, 14:23
quelle

1 Antwort

13

Sie repräsentieren den Heap als Array. Die beiden Elemente unterhalb des Elements i 'th befinden sich an den Positionen 2*i+1 und 2*i+2 . Wenn das Array n -Elemente hat, nimm jedes Element vom Ende an und lass es an die richtige Stelle im Heap "fallen". Dies ist O(n) zum Ausführen.

Warum? Nun, für n/2 der Elemente gibt es keine Kinder. Für n/4 gibt es einen Teilbaum der Höhe 1. Für n/8 gibt es einen Teilbaum der Höhe 2. Für n/16 einen Teilbaum der Höhe 3. Und so weiter. Also bekommen wir die Serie n/22 + 2*n/23 + 3*n/24 + ... = (n/2)(1 * (1/2 + 1/4 + 1/8 + . ...) + (1/2) * (1/2 + 1/4 + 1/8 + . ...) + (1/4) * (1/2 + 1/4 + 1/8 + . ...) + ...) = (n/2) * (1 * 1 + (1/2) * 1 + (1/4) * 1 + ...) = (n/2) * 2 = n . Also die Gesamtzahl von "sehe, ob ich noch einen fallen muss, und wenn ja, auf welche Weise falle ich? Vergleiche kommt zu n . Aber du bekommst Abrundung von Diskretisierung, also kommst du immer zu weniger als% co_de Es gibt% sätze von Swaps, die jeweils höchstens 3 Vergleiche erfordern (Vergleiche root mit jedem Kind, um zu sehen, ob es fallen muss, dann die Kinder untereinander, wenn der root größer als beide Kinder ist.)

    
btilly 20.02.2011, 14:42
quelle

Tags und Links