|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
|
Математическая сложность работы с unordered_map (unordered_set)13.04.2019, 18:08. Показов 11880. Ответов 16
Здравствуйте.
Сравниваю сложность вставки/поиска элемента в упорядоченных map/set и неупорядоченных unoredered_map/unordered_set. Везде пишется, что при работе с неупорядоченным массивом операции поиска и вставки O(1) в общем случае, а в упорядоченном - O(log n). И преимущество неупорядоченных массивов сводится к использованию таблицы хешей. Но мне не понятно, почему, например, при поиске, сравнение в контейнере map<string, string> строчек ключа будет происходить НЕ так же, как сравнение хешей контейнера unordered_map<stringm string>. Ведь сами значения хешей - это тоже текстовая строка, пусть и определенного типа. Я понимаю, когда мы в массиве или векторе обращаемся по индексу - там идет прямое обращение к памяти по смещению от начала. Но если, например, есть контейнер unordered_map<string, string>, то почему в нем поиск элемента будет за время O(1), ведь все равно, если нам нужно извлечь пару по ключу, например, "qwe", то мы должны посмотреть все хеши этого контейнера, пока не найдем тот, который будет равен хешу строки "qwe"?
0
|
|
| 13.04.2019, 18:08 | |
|
Ответы с готовыми решениями:
16
Сложность операции в unordered_map Контейнер unordered_map<string, unordered_map<string,int>> |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||
| 13.04.2019, 18:36 | ||||
|
Почитайте где-нибудь про устройство хеш-таблиц, чтобы ваши вопросы были более предметными.
2
|
||||
|
Комп_Оратор)
|
||
| 13.04.2019, 18:58 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
|||||||
| 13.04.2019, 20:23 [ТС] | |||||||
|
Добавлено через 5 минут Например, есть 5 пар в unordered_map:
Случай с коллизиями я не беру в рассчет - там в целом ясно, что происходит.
0
|
|||||||
|
Комп_Оратор)
|
|||
| 13.04.2019, 20:30 | |||
|
Добавлено через 2 минуты
0
|
|||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
||
| 13.04.2019, 20:35 [ТС] | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 13.04.2019, 20:44 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
||
| 13.04.2019, 20:50 [ТС] | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 13.04.2019, 20:52 | ||
|
под топиком - внизу экрана есть ссылки - пройдите и почитайте.
0
|
||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
|
| 13.04.2019, 21:00 [ТС] | |
|
Теперь я совсем запутался, что же является результатом работы хеш-функции для ключа контейнера? Как выглядит хеш для строки? Или где можно посмотреть пример реализации хеш-функции?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||||||
| 13.04.2019, 21:04 | ||||||||||
|
3 - это, очевидно, значение. А хеш для "e", это hash("e"), где hash - это некая функция хеширования. Например, она может быть такой:
Дальше значение, полученное после хеширования, трансформируется в индекс для одной из корзин (bucket) контейнера, которая по сути массив и есть. Непосредственное сравнение ключей производится только если одному хешу соответствует несколько элементов, в этом случае сложность превращается в O(n), где n количество коллизий. Добавлено через 2 минуты
2
|
||||||||||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
|||
| 13.04.2019, 21:11 [ТС] | |||
|
Не понятно вот это
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 13.04.2019, 21:34 | ||
|
* Метод остатка от деления. * Метод умножения * Метод исключающего ИЛИ И др. Какой конкретно применяется - зависит от реализации, нужно смотреть исходники. Подробнее об этих методах я вам советую прочитать, например у Кнута или Кормена.
1
|
||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
||
| 13.04.2019, 21:49 [ТС] | ||
|
Тогда, возвращаясь к сложности, если нам надо найти в контейнере unordered_map пару {"qwe", 123} по ключу "qwe". Тогда мы вычисляем хеш от строки "qwe", а дальше нам надо обратиться точно по индексу, где в контейнере лежит эта пара.
Но ведь это не значение int от 0 до 4, когда можно точечно обратиться как в массиве, это список из хеш-значений, как нам найти нужное хеш-значение за O(1)? Мы ведь не знаем, где именно оно располагается в списке хеш-значений среди остальных. Добавлено через 5 минут В википедии https://ru.wikipedia.org/wiki/... 1%86%D0%B0:
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||||||
| 13.04.2019, 21:57 | ||||||
Сообщение было отмечено dexterov как решение
Решение
dexterov,
Очень приблизительно и крайне упрощенно:
Количество Buckets в unordered_map - динамическое. Заканчивается место в существующих - выделяется еще один.
2
|
||||||
|
0 / 0 / 0
Регистрация: 05.11.2015
Сообщений: 33
|
|
| 13.04.2019, 22:14 [ТС] | |
|
Да, теперь понятно, получается n-байтный хеш преобразуется в пару маленьких чисел для индексации, что, по идее, сильно увеличивает вероятность возникновения коллизий. При превышении размера таблицы в процессе добавления новых элементов, видимо, все индексы каждый раз перенастраиваются?
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 13.04.2019, 22:32 | |
|
dexterov, в unordered_map все несколько сложнее устроено - там другой метод используется. Предлагаю, если интересно, посмотреть самостоятельно. Я лишь передал общий принцип.
1
|
|
| 13.04.2019, 22:32 | |
|
Помогаю со студенческими работами здесь
17
Как вычислять сложность алгоритма, или найти асимптотическую сложность любой программки?
Переделать код для unordered_set Работа с unordered_map Hash_map unordered_map Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|