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

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

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

Author24 — интернет-сервис помощи студентам
Решил разобраться с этим контейнером, но не вижу ни одной комплексной сатьи по этой теме.
Кто нибудь может ответить на простые вопросы:
1)Имеют ли данные контейнеры практический смысл в сравнение с вектором у которого свой аллокатор ?
2)Я так понимаю что контейнер малопригоден в готовом виде с параметрами по умолчанию ?
3)Если его использовать не в готовом, то хеши надо солить. а солить можно по разному и есть ли какая нибудь удачная реализация (так как чувствую что создам велосипед, если буду делать сам) ?
4)Чем отличается реализация boost unordered_map от std::unordered_map?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2017, 15:26
Ответы с готовыми решениями:

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

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

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

Контейнер unordered_map<string, unordered_map<string,int>>
Ну можно и не unordered_map&lt;string, unordered_map&lt;string,int&gt;&gt;. Мне нужен контейнер который будет...

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

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

Не по теме:

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

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

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

Хэш должен обладать (и стандартная реализация обладает) такими свойствами:
1) Равномерное распределение.
2) Малое изменение в данных должно обеспечивать большое изменение в хэше. (Посчитайте md5 от соседних значений)
Из этих двух свойств, в частности, следует, что можно взять любой огрызок этого хэша - и он будет сам по себе удовлетворять этим свойствам.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 19:39  [ТС] 31
Цитата Сообщение от avgoor
Хэш должен обладать (и стандартная реализация обладает) такими свойствами:
1) Равномерное распределение.
2) Малое изменение в данных должно обеспечивать большое изменение в хэше. (Посчитайте md5 от соседних значений)
Из этих двух свойств, в частности, следует, что можно взять любой огрызок этого хэша - и он будет сам по себе удовлетворять этим свойствам.
Это всё хорошо и так и есть но когда дело доходит до таблиц, то важным становится коеффициент заполнения этих таблиц и тут хеш-функции никому нечего не обещают, особенно когда берётся остаток от деления. От того что её значение прыгает сильно между соседними не панацея от коллизий.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 19:51 32
Цитата Сообщение от Pechkin80 Посмотреть сообщение
то важным становится коеффициент заполнения этих таблиц и тут хеш-функции никому нечего не обещают
Ну как же не обещают то?
Коллизии будут. В этом нет ничего страшного...( Где то я это говорил. Дежавю наверное...)
Главное, чтоб все данные не свалились в одну строку таблицы. Если же вам это удастся - вы на пути к тому, чтобы на*бнуть всю современную криптографию.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 19:51  [ТС] 33
Я лично вижу конфликт требоаний между защитой от коллизий и коеффициентом заполнения таблицы. Но если ктото считает что есть идеальные хеш функции, то вопросов нет.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 20:11 34
Цитата Сообщение от Pechkin80 Посмотреть сообщение
защитой от коллизий
Где вы видели такое требование? Еще раз коллизия в хэш таблице - штатная ситуация.
0
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
25.11.2017, 20:28 35
avgoor, думаю он имел в виду уменьшение количества коллизий.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
25.11.2017, 20:57 36
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Нам надо работать с плохими данными, от которых хеш-ключ вызывают коллизии
Pechkin80, плохих данных не бывает. Бывают плохие постановки задачи. Фактически одинаковость, это, будничным языком выраженная, эквивалентность. То есть, если ученики в классе сравниваются по массе, то девочки и мальчики с разными оценками, волосами, велосипедами, но одинаковыми массами будут "одинаковы". Это я к тому, что данные для внятного анализа должны быть хорошо различимы. Для этого имеет смысл выбирать характеристики, по которым "степень уникальности" объектов наиболее высока. Если же объекты ею по своей природе не обладают (бильярдные шары и все белого цвета), то тогда придётся нумеровать. Беда такой задачи в том, что сами объекты не имеют такого качества как номер и если их нельзя пометить (как клеймят лошадей), то потом жизнь не принесёт радости . То есть, если предметы плохо изучены или описаны, то анализировать просто нечего.
Расскажите о данных и задаче. Именно природой данных и задачей определяется тип контейнера.
Поиск в контексте unordered_map и массивов, это в принципе разные вещи. Для хеш-массива в идеальном варианте (где он неотличим от map) поиск вообще отсутствует, как таковой.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
25.11.2017, 20:59 37
std::unordered_map спроектирован учитывая коллизии, и их может быть миллионы. От части в этом и роль комитета стандартизации - придумать безупречно надежный контейнер. Поэтому дискуссия о коллизиях в std::unordered_map просто бессмысленна, т.к. они там предусмотрены в бесконечном колличестве.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
25.11.2017, 21:05 38
Цитата Сообщение от Kastaneda Посмотреть сообщение
std::unordered_map спроектирован учитывая коллизии
это его свойство, конечно, но
Цитата Сообщение от Kastaneda Посмотреть сообщение
их может быть миллионы
это вполне нормально, если данных, скажем - триллионы.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Поэтому дискуссия о коллизиях в std::unordered_map просто бессмысленна
почему? Тема достаточно сложна и интересна. Значит есть о чём и поговорить. Лишь бы не без толку, конечно.
0
1642 / 1091 / 487
Регистрация: 17.07.2012
Сообщений: 5,345
25.11.2017, 21:13 39
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тема достаточно сложна и интересна.
Только по сути больше имеет отношение к алгоритмам чем к С++.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
25.11.2017, 21:17 40
Цитата Сообщение от Новичок Посмотреть сообщение
Только по сути больше имеет отношение к алгоритмам чем к С++.
В этом есть правда. Но не вся. Хеш-массив, как массив указателей (по сути), интересен и с точки зрения возможных реализаций и тут плюсы как раз в тему.
0
25.11.2017, 21:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2017, 21:17
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru