Volver a los desafíos
Fácil 0 resueltos 0% de aceptación

Hacer crecer un array dinámico

Simula cómo un array dinámico duplica su capacidad y cuenta las reasignaciones y los elementos copiados.

Lo que aprenderás

  • Ver cómo un vector duplica su capacidad
  • Contar las copias hechas al reasignar memoria
  • Entender por qué añadir sigue siendo rápido en promedio

Problema

Ver original (inglés)

Un array dinámico como C++ std::vector almacena sus elementos en un bloque de memoria. Cuando el bloque está lleno y llega un nuevo elemento, asigna un bloque dos veces más grande, copia los elementos existentes y libera el anterior.

Comienza con un array vacío de capacidad initial_capacity y añade pushes elementos uno por uno. Antes de cada inserción, si size == capacity, reasigna: cuenta una reasignación, suma el tamaño actual a los elementos copiados y duplica la capacidad.

Implementa dynamic_array_growth(pushes, initial_capacity).

Input

pushes: Cuántos elementos se añaden.

initial_capacity: La capacidad del array vacío.

Output

Devuelve [reallocations, copied_elements, final_capacity].

Restricciones

0 ≤ pushes ≤ 10^7

1 ≤ initial_capacity ≤ 10^6

Ejemplos

Ejemplo 1
Entrada:
pushes = 5
initial_capacity = 1

Salida esperada:
expected = [3, 7, 8]
Entrada:
long long pushes = 5;
long long initial_capacity = 1;

Salida esperada:
std::vector<long long> expected = {3, 7, 8};
Entrada:
long pushes = 5;
long initial_capacity = 1;

Salida esperada:
long[] expected = new long[] {3, 7, 8};

Explicación

La capacidad crece 1 → 2 → 4 → 8 al añadir el 2nd, 3rd and 5th elements, copiando 1 + 2 + 4 = 7 elements: [3, 7, 8].

Ejemplo 2
Entrada:
pushes = 4
initial_capacity = 4

Salida esperada:
expected = [0, 0, 4]
Entrada:
long long pushes = 4;
long long initial_capacity = 4;

Salida esperada:
std::vector<long long> expected = {0, 0, 4};
Entrada:
long pushes = 4;
long initial_capacity = 4;

Salida esperada:
long[] expected = new long[] {0, 0, 4};

Explicación

Los cuatro elementos caben en el primer bloque, así que no se reasigna nada: [0, 0, 4].

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Solo se reasigna cuando el array está lleno.

Pista 2

Cada vez se copian todos los elementos actuales y la capacidad se duplica.

Pista 3

Puedes saltar de una duplicación a la siguiente en vez de simular cada push.

Complejidad esperada

tiempo O(log pushes), espacio extra O(1)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.