Sobes.tech
Junior

Qual é a complexidade assintótica das operações com a classe std::vector em C++?

sobes.tech IA

Resposta da IA

Complexidade assintótica para as operações principais com std::vector:

Operação Tempo médio Tempo pior
Acesso ao elemento ([], at) O(1) O(1)
Inserção/remover no final O(1) O(N)
Inserção/remover no início/meio O(N) O(N)
Obter tamanho (size) O(1) O(1)
Alterar tamanho (resize) O(N) O(N)

Explicações:

  • O(1) (tempo constante): A operação é realizada em um número fixo de passos, independentemente do tamanho do vetor.
  • O(N) (tempo linear): O tempo de execução da operação é diretamente proporcional à quantidade de elementos no vetor (N).

Adicionalmente:

  • Inserir/remover no final pode requerer O(N) no pior caso devido à reallocação de memória, quando a capacidade atual não é suficiente. Ao fazer realloc, um novo buffer maior é criado e todos os elementos existentes são copiados para ele. Graças à estratégia de alocação de memória (geralmente, duplicar a capacidade), o tempo médio de inserção/remoção no final é O(1).
  • Inserir/remover no meio requer deslocar todos os elementos subsequentes, o que leva O(N) tempo.

Exemplo de realloc em push_back:

// Suponha que o vetor tem uma capacidade de 4 e está cheio
std::vector<int> vec = {1, 2, 3, 4}; // Capacidade = 4, Tamanho = 4

// Adicionar um novo elemento requer realloc
vec.push_back(5); // A capacidade pode passar a ser 8, e todos os elementos são copiados

// A operação push_back neste caso levou O(N) tempo,
// onde N é a quantidade de elementos antes da realloc.