Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

map vs unordered map

31.08.2020, 18:43. Показов 7218. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если обычная std::map построено на основе бинарного дерева поиска(красно черного дерева), то unordered map на основе обычного бинарного дерева?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2020, 18:43
Ответы с готовыми решениями:

Unordered map c++ 11
Добрый день, ранее не использовал данный контейнер: какие плюсы и минусы его использования. Как понять, что именно он нужен тебе?

Обращение к элементам vector, который находится в map, находящийся в map
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить его? map...

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то образом поместить вектора в map и...

18
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
31.08.2020, 19:04
На основе хэш-таблицы
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.08.2020, 23:33  [ТС]
S_el, почему тогда std::map не реализовать через hash-table?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
31.08.2020, 23:51
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
почему тогда std::map не реализовать через hash-table?
Вы же сами написали:
Цитата Сообщение от ReYalp Посмотреть сообщение
std::map построено на основе бинарного дерева поиска
То есть, самоупорядочиваемая, самобалансируемая структура. Без повторов к тому же. Вы легко можете выводить упорядоченные диапазоны. А unordered оно и в Африке не упорьядошьенньо. При хорошей хеш-функции будет искать быстрее чем мапа. Но порядка по ключам можно добиться лишь если хеш монотонен параметру упорядочивания ключей и при условии очень специальной реализации. Актуальная реализация на цепочках (или корзинках, - кому как нравится) не предполагает наличия порядка как такового и хеш-функция не поможет. Впринципе 2-дерево с повторами могло бы работать как карта с повторами, но время поиска не будет соответствовать хеш-таблице. Будет медленнее.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.09.2020, 00:01  [ТС]
IGPIGP, где можно почитать о хеш-таблицах(только о них)?У меня только поверхностные знания о них есть.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.09.2020, 00:50
Цитата Сообщение от ReYalp Посмотреть сообщение
S_el, почему тогда std::map не реализовать через hash-table?
1) Уже упоминавшаяся неупорядоченность ключей.
2) Хеш может работать быстрее мапы. А может и не работать (хотя, адепты хеша скажут что вероятность этого крайне мала). Мап же дает гарантии логарифмического времени вставки и поиска.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.09.2020, 01:19
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, где можно почитать о хеш-таблицах(только о них)?У меня только поверхностные знания о них есть.
Вы будете смеяться, но впервые мне пришлось прочесть более менее понятный текст в сборнике C/C++ Архив программ. Арт Фридман, Ларс Кландер, Марк Михаэлис, Херб Шильдт. М.; "ЗАО "Издательство Бином"" 2001. Глава 4 Смешанные таблицы и разреженные массивы. Там кстати, я впервые узнал что хешировать это значит подмешивать/смешивать. Размазывать в общем. Герб Шилдт (так мне больше нравится) неплохой автор, что бы о нём ни говорили. Но это дело вкуса и предпочтения. Посмотрите также и Сортировка, Двоичные деревья и пр.
1
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.09.2020, 01:48
Цитата Сообщение от ReYalp Посмотреть сообщение
, почему тогда std::map не реализовать через hash-table?
Потому что они имеют абсолютно разные алгоритмы и как результат абсолютно разные свойства. Ассимтотика поиска ключа у хеша гораздо лучше чем у мапа - амортизированное O(1) против гарантированного Log(N).
Но при этом элементы мапа упорядочены - т.е. можно пройти от наибольшего к наименьшему, взять интервал от-до, выполнить поиск до частичного совпадения ключа (ну к примеру как в подсказках при вводе) и т.д.. А у хеша не упорядочены, соответсвенно все эти возможности возможность отсутсвуют.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.09.2020, 10:35
Цитата Сообщение от IGPIGP Посмотреть сообщение
Впринципе 2-дерево с повторами могло бы работать как карта с повторами, но время поиска не будет соответствовать хеш-таблице. Будет медленнее.
Про повторы зря написал. unordered и multy это ортогональные префиксы, но я иногда путаю (не в коде, а в речи)
ReYalp, есть "детская задачка" - подсчитать количества разных символов в заданном тексте. Одно из красивых решений - создать массив размером в количество разных символов (можно просто char_max). И изначально инициализировать нулями, предполагая что нет ни каких символов. Потом идём по тексту и каждый символ приводим к size_t (считая char беззнаковым) и полученное значение используем как значение индекса в массиве увеличивая значение по индексу на 1. Это похоже на хеширование (вернее это оно и есть) при хеше типа
C++
1
int hash_eq_val(const SomeType &val){return val;}
Это если есть преобразование. Если нет то можно пнуть вплоть до reinterpret_cast<int> иной раз. Но такие простые хеши - редкость. Хотя в некоторых алгоритмах могут очень пригодиться.

Тут важен сам принцип именно для понимания. Если есть способ получить число по значению типа и он даёт хорошо "размазанную" картину на рассматриваемом множестве значений, то на этом множестве значений такой способ - катит за хеш-функцию.
А получив число - используем как индекс размещения значения. А потом, зная значение индекса по хешу сразу находим место в массиве где оно (значение) уже есть или ещё нет и говорим юзеру. Получается, что положение элемента не ищется а рассчитывается по его значению, а потом используя полученное число как индекс в массиве-хранилище - смотрим есть или нет. Там могут быть повторы (хэш не всегда уникален). Вот почему место хранения реализуют как связный список, а хранятся указатели. Но это уже детали, которые лучше прочесть самому.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.09.2020, 11:59  [ТС]
IGPIGP, а как работают хеш функции в хеш таблицах? Она же должна как-то +- выравнивать хеш под количество места в выделенном куске памяти? И еще мне не совсем понятно почему хеш таблица? Если использовать списки в хеш таблице то время поиска в худшем случае может быть O(n) , функция вставки в худшем случае тоже О(n)(если массив меньше чем хеш)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.09.2020, 12:11
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, а как работают хеш функции в хеш таблицах? Она же должна как-то +- выравнивать хеш под количество места в выделенном куске памяти? И еще мне не совсем понятно почему хеш таблица? Если использовать списки в хеш таблице то время поиска в худшем случае может быть O(n) , функция вставки в худшем случае тоже О(n)(если массив меньше чем хеш)
Хэш таблица это массив определённого размера. По ключу вычисляется какое-то целое число, хэш. Остаток от деления этого числа на размер массива будет индексом ячейки, куда нужно положить этот ключ.

Добавлено через 52 секунды
Естественно, будут возникать коллизии - разные ключи будут указывать на одну ячейку

Добавлено через 1 минуту
Когда количество этих коллизий превысить какую-то величину - просто увеличиваем размер массива и пересчитываем индексы для каждого ключа

Добавлено через 1 минуту
Если используется хорошая хэш-функция, то количество коллизий в этом случае уменьшается и время поиска ключа приближается к O(1)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.09.2020, 12:16
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, а как работают хеш функции в хеш таблицах? Она же должна как-то +- выравнивать хеш под количество места в выделенном куске памяти?
Да. Должна - ключевое слово. Но она ещё кое-что должна. Она должна сочетать вот то что вы говорите и приемлемую скорость. Для длинных строк нет решения. При чём говорят, это теоретически обоснованно.
Цитата Сообщение от ReYalp Посмотреть сообщение
Если использовать списки в хеш таблице то время поиска в худшем случае может быть O(n) , функция вставки в худшем случае тоже О(n)(если массив меньше чем хеш)
Хеш-индекс (хеш) реализует доступ к цепочке/корзинке. А корзинка реализована цепью. Чем хуже хеш-функция тем ближе хеш-массив к одному огроменному списку. В хорошем случае в корзинках не так уж много конфликтующих (коллизионирующих) значений, в среднем. А таблица это принцип. Это можно сказать интерфейс. Сам массив может прехэшироваться (менять размер) в зависимости от заселённости корзинок. Это потому, что чем больше отношение незанятого к занятому, тем хуже эффективность использования памяти.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.09.2020, 12:26  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Естественно, будут возникать коллизии - разные ключи будут указывать на одну ячейку
А что происходит когда я хочу получить значение по ключу?Как определяется какое значение какому ключу принадлежит?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.09.2020, 12:29
Цитата Сообщение от ReYalp Посмотреть сообщение
А что происходит когда я хочу получить значение по ключу?Как определяется какое значение какому ключу принадлежит?
Хеш считается и в массив смотрется по индексу. ReYalp, в вас чувствуется сильное желание получить знания с чьей-то лопаты непосредственно в голову. Так не пойдёт. Читайте, а направление можно получить тут.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.09.2020, 12:34  [ТС]
IGPIGP, As we can see, it may happen that the hashing technique is used to create an already used index of the array. In such a case, we can search the next empty location in the array by looking into the next cell until we find an empty cell. This technique is called linear probing.
линейная хеш таблица, если хеш нового ключа уже есть ищем свободную ячейку, но при следующем использовании этого ключа откуда мне знать что данные лежат именно в той ячейке(кторую я раньше нашел как свободную)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.09.2020, 12:40
Цитата Сообщение от ReYalp Посмотреть сообщение
линейная хеш таблица, если хеш нового ключа уже есть ищем свободную ячейку, но при следующем использовании этого ключа откуда мне знать что данные лежат именно в той ячейке(кторую я раньше нашел как свободную)
Это просто другая реализация. Она не использует цепочки. А в stl типичной реализацией является хешмассив на цепочках, на сколько я знаю. В любом случае у вас есть возможность получить список коллизий по данному ключу/хэшу. Тут ещё важно понимать разницу между эквивалентностью и тождественностью. То есть, если студенты курса хешированы по росту и вы ищете Петю Пупкина, то знание его роста очень сократит поиск. Корзинку вы найдёте быстро. А потом по имени, фамилии, отчеству, году, предпочтениям в музыке и т.п.
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.09.2020, 13:07
Цитата Сообщение от ReYalp Посмотреть сообщение
А что происходит когда я хочу получить значение по ключу?Как определяется какое значение какому ключу принадлежит?
Исходное значение ключа тоже хранится. Бежим по цепочке коллизий и ищем нужный ключ.
1
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.09.2020, 13:22
Цитата Сообщение от ReYalp Посмотреть сообщение
Она же должна как-то +- выравнивать хеш под количество места в выделенном куске памяти?
В большинстве случаев используют кусок размером степень двойки. так удобнее. При этом обычный хеш с открытой адресацией юзает обыяно коэффициент заполнения 75%. Потом расширяется. Хотя опять же степень двойки - это просто для ускорения. Может любой размер юзать. Просто значение хеша берется как остаток от деления значения хеш функции на юзаемый размер. Со степенями дваойки просто нахождение этого остатка гораздо быстрее - вырезаются n младших бит.
Кукушкин хеш к примеру юзает не менее двух таблиц и коэффициен заполнения там около 50% - он расширяется при неразрешимой коллизии. Но зато у него поиск гарантированное O(1) а вставка аммортизированное O(1). Добавлением третьей хеш функции можно коэффициент заполнения повысить до примерно 80%.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.09.2020, 13:48
Цитата Сообщение от ReYalp Посмотреть сообщение
почему тогда std::map не реализовать через hash-table?
У каждого способа свои достоинства и недостатки потому что.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2020, 13:48
Помогаю со студенческими работами здесь

Обращение к map, который внутри другого map
std::map&lt;int, std::map&lt;std::string, int&gt;&gt; m1; std::map&lt;std::string, int&gt; m2; void main() { m1 = m2; m2 = 7; ...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ?
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200) Использовать именно map&lt;string,...

Как вставить map в map
есть такой map map &lt; INT64 , map &lt;INT64 , map&lt; wArray , int &gt; &gt; &gt; tMenu; как его заполнить? пробовал так ...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru