21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249

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

25.11.2017, 15:26. Показов 14425. Ответов 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 / 3206 / 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,361
25.11.2017, 20:28
avgoor, думаю он имел в виду уменьшение количества коллизий.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 20:57
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Нам надо работать с плохими данными, от которых хеш-ключ вызывают коллизии
Pechkin80, плохих данных не бывает. Бывают плохие постановки задачи. Фактически одинаковость, это, будничным языком выраженная, эквивалентность. То есть, если ученики в классе сравниваются по массе, то девочки и мальчики с разными оценками, волосами, велосипедами, но одинаковыми массами будут "одинаковы". Это я к тому, что данные для внятного анализа должны быть хорошо различимы. Для этого имеет смысл выбирать характеристики, по которым "степень уникальности" объектов наиболее высока. Если же объекты ею по своей природе не обладают (бильярдные шары и все белого цвета), то тогда придётся нумеровать. Беда такой задачи в том, что сами объекты не имеют такого качества как номер и если их нельзя пометить (как клеймят лошадей), то потом жизнь не принесёт радости . То есть, если предметы плохо изучены или описаны, то анализировать просто нечего.
Расскажите о данных и задаче. Именно природой данных и задачей определяется тип контейнера.
Поиск в контексте unordered_map и массивов, это в принципе разные вещи. Для хеш-массива в идеальном варианте (где он неотличим от map) поиск вообще отсутствует, как таковой.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.11.2017, 20:59
std::unordered_map спроектирован учитывая коллизии, и их может быть миллионы. От части в этом и роль комитета стандартизации - придумать безупречно надежный контейнер. Поэтому дискуссия о коллизиях в std::unordered_map просто бессмысленна, т.к. они там предусмотрены в бесконечном колличестве.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 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,361
25.11.2017, 21:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тема достаточно сложна и интересна.
Только по сути больше имеет отношение к алгоритмам чем к С++.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru