Ich lese eine Analyse zu dynamischen Arrays (aus dem Skiena-Algorithmushandbuch).
Das heißt, wenn wir eine Array-Struktur haben und jedes Mal, wenn wir keinen Platz mehr haben, ein neues Array zuweisen, das doppelt so groß ist wie das Original.
Es beschreibt die Verschwendung, die auftritt, wenn die Größe des Arrays geändert werden muss.
Es heißt, dass (n / 2) +1 bis n höchstens einmal oder gar nicht verschoben werden. Das ist klar.
Wenn man dann beschreibt, dass sich die Hälfte der Elemente einmal, ein Viertel der Elemente zweimal usw. bewegt, ergibt sich die Gesamtzahl der Bewegungen M aus:
Dies scheint mir, dass es mehr Kopien hinzufügt, als tatsächlich passieren.
Z.B
wenn wir folgendes haben:
array of 1 element
+--+
|a |
+--+
double the array (2 elements)
+--++--+
|a ||b |
+--++--+
double the array (4 elements)
+--++--++--++--+
|a ||b ||c ||c |
+--++--++--++--+
double the array (8 elements)
+--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x |
+--++--++--++--++--++--++--++--+
double the array (16 elements)
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
Wir haben das x-Element 4-mal kopiert, das c-Element 4-mal kopiert, das b-Element 4-mal kopiert und ein Element 5-mal kopiert, sodass insgesamt 4 + 4 + 4 + 5 = 17 Kopien / Bewegungen sind.
Aber gemäß der Formel sollten wir 1 * (16/2) + 2 * (16/4) + 3 * (16/8) + 4 * (16/16) = 8 + 8 + 6 + 4 = 26 Kopien von haben Elemente zur Vergrößerung des Arrays auf 16 Elemente.
Ist dies ein Fehler oder besteht das Ziel der Formel darin, eine grobe Annäherung an die Obergrenze bereitzustellen? Oder verstehe ich hier etwas falsch?
b
wird dreimal, jeweils c
zweimal und jeweils x
einmal kopiert . 15 Exemplare.