Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/65: Рейтинг темы: голосов - 65, средняя оценка - 4.92
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249

Unordered_map правильное применение

25.11.2017, 15:26. Показов 13904. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил разобраться с этим контейнером, но не вижу ни одной комплексной сатьи по этой теме.
Кто нибудь может ответить на простые вопросы:
1)Имеют ли данные контейнеры практический смысл в сравнение с вектором у которого свой аллокатор ?
2)Я так понимаю что контейнер малопригоден в готовом виде с параметрами по умолчанию ?
3)Если его использовать не в готовом, то хеши надо солить. а солить можно по разному и есть ли какая нибудь удачная реализация (так как чувствую что создам велосипед, если буду делать сам) ?
4)Чем отличается реализация boost unordered_map от std::unordered_map?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2017, 15:26
Ответы с готовыми решениями:

Каким образом unordered_map выдает правильное значение для ключа, если его хеш функция допускает коллизии?
Читаю книгу джосаттис стандартная библиотека c++, там в разделе про unordered_map есть описание данного контейнера Раз уж каждый...

Правильное применение функций
Есть задачка одна, студенческая, простая вроде, проблема лишь в том что к ней надо подключить функции, функции вроде понел как их...

Правильное применение перечисления enum
Дело в том, что не пойму как работать с перечислением. Мне нужно, чтобы программа принимала данные о 3 сотрудниках ( дата найма на работу,...

62
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.11.2017, 17:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TRam_ Посмотреть сообщение
чем больше элементов в таблице, тем больше должен быть её размер
Строго говоря нет, с использованием bucket'ов (как это сделано в С++) размер таблицы может быть 1 при этом я могу туда засунуть миллион объектов. От маленького размера пострадает скорость доступа по ключу, поэтому задача разработчиков stdlib найти компромис между размером таблицы и скоростью доступа.

Добавлено через 1 минуту
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Суть в то что пространство ключей меньше пространства данных.
Так и есть, а в чем тогда вопрос?
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 18:08  [ТС]
Kastaneda, Вопрос в том что вот мы имеем для примера такой случай: Нам надо работать с плохими данными, от которых хеш-ключ вызывают коллизии, и другого варианта для ключа, кроме как брать хеш от данных мы не имеем (Для меня загадка почему это 1% процент всех случаев, но не хочу уходить от сути), суть в том что нужно солить, чтобы избежать коллизии. Нездорово будет, если делать велосипед, так как это показывает узкий кругозор. интересно узнать есть ли чтото готовое. Я так понимаю стандартная функция std::hash ничего не солит.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 18:22
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Я так понимаю стандартная функция std::hash ничего не солит.
Соль хэшей нам нужна тогда, когда для одинаковых данных нужны разные хэши. В случае хэш таблиц - для одинаковых данных нужны одинаковые хэши. Вот вы ищете в таблице строку "Вася Пупкин". Посчитали от нее хэш. А в таблице хэши соленые. Ну и толку от них? Коллизии будут. В этом ничего страшного нет.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 18:28
Pechkin80, "соление" (добавление псеводослучайного куска к ключу) только и сможет что всё поломает. Тут нужно именно делать свою хэш-функцию, например передавая в std::hash не исходный ключ, а преобразованный по некому вашему алгоритму, в предположении что от этого он станет более равномерно распределён по индексам. Но это никакая не соль, это просто "кастомная" хэш-функция.
0
25.11.2017, 18:31

Не по теме:

Писал ответ, но avgoor уже объяснил

0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 18:56  [ТС]
TRam_, А соление как часть "нового" алгоритма не вариант ?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 19:09
Цитата Сообщение от Pechkin80 Посмотреть сообщение
А соление как часть "нового" алгоритма не вариант ?
"Соль" должна быть одинаковой для всех данных, что не позволяет называть ее солью.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 19:15
Цитата Сообщение от Pechkin80 Посмотреть сообщение
"нового"
Ну а как себе это представляешь? Был у тебя некий уникальный ключ, а к нему приписал случайное число, и пытаешься по этой сумме (которая стала случайной) определить, куда указывал ключ. Естественно сумма каждый раз будет разной, и найти ничего не удастся.

Добавлено через 1 минуту
Вот сами ключи, если их изначально нет, можно сгенерировать случайным образом (хотя тогда уж лучше просто построить таблицу указателей/индексов). Но если ключи УЖЕ есть, то тут нужно возиться с ними и исключительно с ними, без какого-либо рандома.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 19:21  [ТС]
avgoor, Не хочу спорить о терминах. Суть в том что хеш короткий, а данные очень похожи одни на другие и имеют много тривиальных значений (мнооого нулей). Для всех алгоритмов хеширования это "некомфортная" ситуация. Алгоритмы любят, когда хеши длинные, а данные сильно отличаются. Так как хеш - индекс массива, то длинным его делать неразумно. STL контейнеры, насколько я вычитал вообще берут модуль от него чтоб получить индекс.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 19:31
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Суть в том что хеш короткий, а данные очень похожи одни на другие и имеют много тривиальных значений (мнооого нулей). Для всех алгоритмов хеширования это "некомфортная" ситуация.
Нет.
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Алгоритмы любят, когда хеши длинные, а данные сильно отличаются. Так как хеш - индекс массива, то длинным его делать неразумно.
Нет.
Цитата Сообщение от Pechkin80 Посмотреть сообщение
STL контейнеры, насколько я вычитал вообще берут модуль от него.
Bingo. (Если вы имеете ввиду остаток от деления).

Хэш должен обладать (и стандартная реализация обладает) такими свойствами:
1) Равномерное распределение.
2) Малое изменение в данных должно обеспечивать большое изменение в хэше. (Посчитайте md5 от соседних значений)
Из этих двух свойств, в частности, следует, что можно взять любой огрызок этого хэша - и он будет сам по себе удовлетворять этим свойствам.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 19:39  [ТС]
Цитата Сообщение от avgoor
Хэш должен обладать (и стандартная реализация обладает) такими свойствами:
1) Равномерное распределение.
2) Малое изменение в данных должно обеспечивать большое изменение в хэше. (Посчитайте md5 от соседних значений)
Из этих двух свойств, в частности, следует, что можно взять любой огрызок этого хэша - и он будет сам по себе удовлетворять этим свойствам.
Это всё хорошо и так и есть но когда дело доходит до таблиц, то важным становится коеффициент заполнения этих таблиц и тут хеш-функции никому нечего не обещают, особенно когда берётся остаток от деления. От того что её значение прыгает сильно между соседними не панацея от коллизий.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 19:51
Цитата Сообщение от Pechkin80 Посмотреть сообщение
то важным становится коеффициент заполнения этих таблиц и тут хеш-функции никому нечего не обещают
Ну как же не обещают то?
Коллизии будут. В этом нет ничего страшного...( Где то я это говорил. Дежавю наверное...)
Главное, чтоб все данные не свалились в одну строку таблицы. Если же вам это удастся - вы на пути к тому, чтобы на*бнуть всю современную криптографию.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 19:51  [ТС]
Я лично вижу конфликт требоаний между защитой от коллизий и коеффициентом заполнения таблицы. Но если ктото считает что есть идеальные хеш функции, то вопросов нет.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 20:11
Цитата Сообщение от Pechkin80 Посмотреть сообщение
защитой от коллизий
Где вы видели такое требование? Еще раз коллизия в хэш таблице - штатная ситуация.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
25.11.2017, 20:28
avgoor, думаю он имел в виду уменьшение количества коллизий.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 20:57
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Нам надо работать с плохими данными, от которых хеш-ключ вызывают коллизии
Pechkin80, плохих данных не бывает. Бывают плохие постановки задачи. Фактически одинаковость, это, будничным языком выраженная, эквивалентность. То есть, если ученики в классе сравниваются по массе, то девочки и мальчики с разными оценками, волосами, велосипедами, но одинаковыми массами будут "одинаковы". Это я к тому, что данные для внятного анализа должны быть хорошо различимы. Для этого имеет смысл выбирать характеристики, по которым "степень уникальности" объектов наиболее высока. Если же объекты ею по своей природе не обладают (бильярдные шары и все белого цвета), то тогда придётся нумеровать. Беда такой задачи в том, что сами объекты не имеют такого качества как номер и если их нельзя пометить (как клеймят лошадей), то потом жизнь не принесёт радости . То есть, если предметы плохо изучены или описаны, то анализировать просто нечего.
Расскажите о данных и задаче. Именно природой данных и задачей определяется тип контейнера.
Поиск в контексте unordered_map и массивов, это в принципе разные вещи. Для хеш-массива в идеальном варианте (где он неотличим от map) поиск вообще отсутствует, как таковой.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.11.2017, 20:59
std::unordered_map спроектирован учитывая коллизии, и их может быть миллионы. От части в этом и роль комитета стандартизации - придумать безупречно надежный контейнер. Поэтому дискуссия о коллизиях в std::unordered_map просто бессмысленна, т.к. они там предусмотрены в бесконечном колличестве.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 21:05
Цитата Сообщение от Kastaneda Посмотреть сообщение
std::unordered_map спроектирован учитывая коллизии
это его свойство, конечно, но
Цитата Сообщение от Kastaneda Посмотреть сообщение
их может быть миллионы
это вполне нормально, если данных, скажем - триллионы.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому дискуссия о коллизиях в std::unordered_map просто бессмысленна
почему? Тема достаточно сложна и интересна. Значит есть о чём и поговорить. Лишь бы не без толку, конечно.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
25.11.2017, 21:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тема достаточно сложна и интересна.
Только по сути больше имеет отношение к алгоритмам чем к С++.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 21:17
Цитата Сообщение от Новичок Посмотреть сообщение
Только по сути больше имеет отношение к алгоритмам чем к С++.
В этом есть правда. Но не вся. Хеш-массив, как массив указателей (по сути), интересен и с точки зрения возможных реализаций и тут плюсы как раз в тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2017, 21:17
Помогаю со студенческими работами здесь

Контейнер unordered_map<string, unordered_map<string,int>>
Ну можно и не unordered_map&lt;string, unordered_map&lt;string,int&gt;&gt;. Мне нужен контейнер который будет по 2 ключам типа string выдавать int. ...

Правильное применение с basic_stream
Доброго времени суток! Класс ios_base&lt;&gt; дает нам стандартные потоки из/в файл, строку и консоль. Допустим, если я хочу получать...

Правильное применение !
Решил открыть сайт о играх и фильмах, есть уже около 1000 готовых копирайт статей ... тематика сайта именно рецензии и описания, а не...

Правильное применение токового зеркала
Всем привет. Хочу собрать усилитель на транзисторе с низкими собственными шумами. Нагрузка высокоимпедансная, поэтому надо ограничить...

VAO, VBO и их правильное применение
Всех с наступившем, в общем меня интересует вопрос как правильно использовать VBO и VAO чтобы достичь максимального быстродействия. ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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