Retour aux défis
Facile 0 résolus 0 % de réussite

Faire grandir un tableau dynamique

Simule comment un tableau dynamique double sa capacité et compte les réallocations et les éléments copiés.

Ce que vous allez apprendre

  • Voir comment un vector double sa capacité
  • Compter les copies faites lors des réallocations
  • Comprendre pourquoi l'ajout reste rapide en moyenne

Problème

Un tableau dynamique comme std::vector en C++ stocke ses éléments dans un seul bloc de mémoire. Quand le bloc est plein et qu'un nouvel élément arrive, il alloue un bloc deux fois plus grand, copie les éléments existants, puis libère l'ancien.

Commence avec un tableau vide de capacité initial_capacity et ajoute pushes éléments un par un. Avant chaque ajout, si size == capacity, réalloue : compte une réallocation, ajoute la taille actuelle au nombre d'éléments copiés, et double la capacité.

Implémente dynamic_array_growth(pushes, initial_capacity).

Entrée

pushes: Combien d'éléments sont ajoutés.

initial_capacity: La capacité du tableau vide.

Sortie

Retourne [reallocations, copied_elements, final_capacity].

Contraintes

0 ≤ pushes ≤ 10^7

1 ≤ initial_capacity ≤ 10^6

Exemples

Exemple 1
Entrée :
pushes = 5
initial_capacity = 1

Sortie attendue :
expected = [3, 7, 8]
Entrée :
long long pushes = 5;
long long initial_capacity = 1;

Sortie attendue :
std::vector<long long> expected = {3, 7, 8};
Entrée :
long pushes = 5;
long initial_capacity = 1;

Sortie attendue :
long[] expected = new long[] {3, 7, 8};

Explication

La capacité passe de 1 → 2 → 4 → 8 lors de l'ajout des 2e, 3e et 5e éléments, en copiant 1 + 2 + 4 = 7 éléments : [3, 7, 8].

Exemple 2
Entrée :
pushes = 4
initial_capacity = 4

Sortie attendue :
expected = [0, 0, 4]
Entrée :
long long pushes = 4;
long long initial_capacity = 4;

Sortie attendue :
std::vector<long long> expected = {0, 0, 4};
Entrée :
long pushes = 4;
long initial_capacity = 4;

Sortie attendue :
long[] expected = new long[] {0, 0, 4};

Explication

Les quatre éléments tiennent dans le premier bloc, donc rien n'est réalloué : [0, 0, 4].

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Une réallocation n'a lieu que lorsque le tableau est plein.

Indice 2

À chaque fois, tous les éléments sont copiés et la capacité double.

Indice 3

Vous pouvez sauter d'un doublement au suivant au lieu de simuler chaque push.

Complexité attendue

temps O(log pushes), espace supplémentaire O(1)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.