Alle Herausforderungen
Einfach 0 gelöst 0% Erfolgsquote

Ein dynamisches Array wachsen lassen

Simuliere, wie ein dynamisches Array seine Kapazität verdoppelt und zähle die Reallokationen und kopierten Elemente.

Das lernst du

  • Sehen, wie ein Vector seine Kapazität verdoppelt
  • Beim Neuanlegen kopierte Elemente zählen
  • Verstehen, warum Anhängen im Schnitt schnell bleibt

Problem

Ein dynamisches Array wie C++ std::vector speichert seine Elemente in einem einzigen Speicherblock. Wenn der Block voll ist und ein neues Element hinzukommt, allokiert es einen Block doppelt so groß, kopiert die vorhandenen Elemente hinein und gibt den alten frei.

Beginne mit einem leeren Array mit der Kapazität initial_capacity und füge pushes Elemente nacheinander hinzu. Bevor du jedes Element einfügst, gilt: Wenn size == capacity, dann reallokiere: zähle eine Reallokation, addiere die aktuelle size zu den kopierten Elementen und verdopple die capacity.

Implementiere dynamic_array_growth(pushes, initial_capacity).

Eingabe

pushes: Wie viele Elemente eingefügt werden.

initial_capacity: Die Kapazität des leeren Arrays.

Ausgabe

Gib [reallocations, copied_elements, final_capacity] zurück.

Einschränkungen

0 ≤ pushes ≤ 10^7

1 ≤ initial_capacity ≤ 10^6

Beispiele

Beispiel 1
Eingabe:
pushes = 5
initial_capacity = 1

Erwartete Ausgabe:
expected = [3, 7, 8]
Eingabe:
long long pushes = 5;
long long initial_capacity = 1;

Erwartete Ausgabe:
std::vector<long long> expected = {3, 7, 8};
Eingabe:
long pushes = 5;
long initial_capacity = 1;

Erwartete Ausgabe:
long[] expected = new long[] {3, 7, 8};

Erläuterung

Die Kapazität wächst beim Einfügen des 2., 3. und 5. Elements von 1 → 2 → 4 → 8, wobei 1 + 2 + 4 = 7 Elemente kopiert werden: [3, 7, 8].

Beispiel 2
Eingabe:
pushes = 4
initial_capacity = 4

Erwartete Ausgabe:
expected = [0, 0, 4]
Eingabe:
long long pushes = 4;
long long initial_capacity = 4;

Erwartete Ausgabe:
std::vector<long long> expected = {0, 0, 4};
Eingabe:
long pushes = 4;
long initial_capacity = 4;

Erwartete Ausgabe:
long[] expected = new long[] {0, 0, 4};

Erläuterung

Alle vier Elemente passen in den ersten Block, daher wird nichts reallokiert: [0, 0, 4].

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Neu angelegt wird nur, wenn das Array voll ist.

Hinweis 2

Dabei werden alle vorhandenen Elemente kopiert, und die Kapazität verdoppelt sich.

Hinweis 3

Du kannst von einer Verdopplung zur nächsten springen, statt jeden Push zu simulieren.

Erwartete Komplexität

Zeit O(log Pushes), zusätzlicher Speicher O(1)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.