Назад к вопросам
Middle
415
questionbank
Какова асимптотическая сложность операций для контейнеров unordered_set и set в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Асимптотическая сложность операций для std::unordered_set и std::set в C++17:
| Операция | std::unordered_set (средний случай) |
std::unordered_set (худший случай) |
std::set |
|---|---|---|---|
| Вставка (insert) | O(1) | O(n) | O(log n) |
| Удаление (erase) | O(1) | O(n) | O(log n) |
| Поиск (find) | O(1) | O(n) | O(log n) |
| Доступ | Неприменимо | Неприменимо | O(log n) (итератор) |
std::unordered_setоснован на хеш-таблице. Средний случай сложности O(1) достигается при хорошей хеш-функции и отсутствии большого количества коллизий. Худший случай O(n) возникает при сильных коллизиях (например, все элементы хешируются в один бакет) или при неэффективном распределении элементов.std::setоснован на сбалансированном бинарном дереве поиска (обычно красно-черном дереве). Сложность O(log n) обусловлена логарифмической высотой дерева, где n — количество элементов.
Важные заметки:
- Худший случай для
std::unordered_setвставка и удаление может включать рехеширование, что при надобности перестроить всю таблицу займет O(n). - Операция доступа для
std::setчерез итератор также имеетлогаррифмическую сложность.
#include <unordered_set> // Для unordered_set
#include <set> // Для set
// Пример использования std::unordered_set
std::unordered_set<int> uset;
uset.insert(10); // Средний O(1), Худший O(n)
uset.find(10); // Средний O(1), Худший O(n)
uset.erase(10); // Средний O(1), Худший O(n)
// Пример использования std::set
std::set<int> s;
s.insert(10); // O(log n)
s.find(10); // O(log n)
s.erase(10); // O(log n)