Sobes.tech
Junior

Каква е асимптотичната сложност на операциите с класа std::vector в C++?

sobes.tech AI

Отговор от AI

Асимптотична сложност за основните операции с std::vector:

Операция Средно време Най-лошо време
Достъп до елемент ([], at) O(1) O(1)
Вмъкване/изтриване в края O(1) O(N)
Вмъкване/изтриване в началото/средата O(N) O(N)
Получаване на размер (size) O(1) O(1)
Промяна на размера (resize) O(N) O(N)

Обяснения:

  • O(1) (константно време): Операцията се изпълнява за фиксирано количество стъпки, независимо от размера на вектора.
  • O(N) (линейно време): Времето за изпълнение на операцията е пропорционално на броя на елементите в вектора (N).

Допълнително:

  • Вмъкването/изтриването в края може да изисква O(N) в най-лошия случай поради преразпределение на паметта (realloc), когато текущият капацитет не е достатъчен. При realloc се създава нов буфер с по-голям размер и всички съществуващи елементи се копират в него. Благодарение на стратегията за разпределение на паметта (обикновено удвояване на капацитета), средното време за вмъкване/изтриване в края е O(1).
  • Вмъкването/изтриването в средата изисква преместване на всички следващи елементи, което отнема O(N) време.

Пример за преразпределение при push_back:

// Да предположим, че векторът има капацитет 4 и е пълен
std::vector<int> vec = {1, 2, 3, 4}; // Капацитет = 4, Размер = 4

// Добавяне на нов елемент изисква преразпределение
vec.push_back(5); // Възможно е капацитетът да стане 8 и всички елементи да бъдат копирани

// Операцията push_back в този случай отне O(N) време,
// където N е броят на елементите преди преразпределението.