Сложность времени find() в std:: map?

129
14

Насколько эффективна функция find() в классе std:: map? Проводит ли он все элементы, которые ищут ключ, такой, что он O (n), или он находится в сбалансированном дереве, или использует хэш-функцию или что?

спросил(а) 2020-03-27T14:11:51+03:00 2 месяца назад
1
Решение
194

Журнал (n) Он основан на красном черном дереве.

Изменить: n - это, конечно, количество членов на карте.

ответил(а) 2020-03-27T14:34:30.227152+03:00 2 месяца назад
147

std::map и std::set реализуются поставщиками компиляторов с использованием высоко сбалансированных двоичных деревьев поиска (например, красно-черного дерева, дерева AVL).


Как правильно указал Дэвид, find будет принимать время O (log n), где n - количество элементов в контейнере.


Но с примитивными типами данных, такими как int, long, char, double и т.д., а не с строками.

Если std:string, скажем, размер 'm', используется как ключ, для перемещения по высоте сбалансированного дерева двоичного поиска потребуется log n сравнения данного ключа с записью дерева.


Когда std::string является ключом операций std::map или std::set, find и insert будет стоить O (m log n), где m - длина заданной строки, которая должна быть найдена.

ответил(а) 2020-03-27T14:11:51+03:00 2 месяца назад
75

Он не выполняет итерацию всех элементов, он выполняет двоичный поиск (это O (log (n))). Он использует оператор < или компаратор для выполнения поиска.


Если вы хотите создать хэш-карту, вы можете использовать std:: unordered_map (добавленный на С++ - 0x), который использует хеш-функцию и в среднем (в зависимости от хэш-функции и данных, которые вы предоставляете) find() будет O (1).

ответил(а) 2020-03-27T14:11:51+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема