Назад к вопросам
Junior
142
questionbank
Какова асимптотическая сложность операций с списком (list) в языке C/C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
| Операция | Асимптотическая сложность (std::list) | Примечания |
|---|---|---|
| Доступ по индексу | O(n) | Требует обхода элементов. |
| Вставка/удаление в начало | O(1) | |
| Вставка/удаление в конец | O(1) | |
| Вставка/удаление по итератору | O(1) | Если итератор действителен и указывает на место |
| Поиск элемента | O(n) | Линейный поиск. |
| Слияние | O(N+M) | Где N и M - размеры списков. |
| Разворот (reverse) | O(n) | |
| Сортировка | O(n log n) | Использует модифицированный merge sort. |
std::list - это двусвязный список.
Преимущества:
- Быстрая вставка и удаление в любой позиции (O(1)) при наличии итератора.
- Не требует сдвига элементов при вставке/удалении.
Недостатки:
- Медленный доступ по индексу (O(n)).
- Больший расход памяти по сравнению с
std::vectorиз-за хранения указателей. - Итераторы могут инвалидироваться только при удалении элемента, на который они указывают (кроме
clear).
Пример вставки/удаления:
#include <list>
#include <iostream>
int main() {
std::list<int> my_list = {1, 2, 3, 4, 5};
// Вставка в начало
my_list.push_front(0); // O(1)
// Удаление из конца
my_list.pop_back(); // O(1)
// Вставка по итератору
auto it = my_list.begin();
std::advance(it, 2); // Перемещение итератора на 2 позиции (O(n) для list)
my_list.insert(it, 10); // Вставка перед итератором (O(1))
// Удаление по итератору
it = my_list.begin();
std::advance(it, 3);
my_list.erase(it); // Удаление элемента по итератору (O(1))
return 0;
}