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

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

25.11.2017, 15:26. Показов 14764. Ответов 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
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 21:37  [ТС]
Студворк — интернет-сервис помощи студентам
IGPIGP, Постановка задачи предполагает что данные случайны. Не уверен что приведу хороший пример, но я больше думую в сторону транспортных задач (всякие хеши сессий, скрытые за NATом).
Коллизии приемлемы тогда, когда ситуация управляемая, но как управлять ситуацией не имея представления и содержимом ?
Интерфейс unordered_map/unordered_set даже не даёт средств для поиска коллизий. Эти структуры данных могут быть частью какого нибудь сервера, работающего в режиме 24/7.

Добавлено через 11 минут
Подмешивание псевдослучайных данных как средство от коллапса, когда стало много одинаковых данных, или мы пришли в подмножество данных где коллизии вероятны.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 21:37
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Постановка задачи предполагает что данные случайны.
В каком смысле они случайны? Pechkin80, для выбора способа хранения и поиска нужно знать какими характеристиками описываются данные. Каждое поле это степень свободы.
То есть, порядок поступления (если в этом заключается случайность) не имеет тут значения. Для map/set - бинарных деревьев - имеет.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 21:43  [ТС]
IGPIGP, Случайны по размеру, по содержимому, по порядку поступления. По природе своей случайны, например пакеты в сетевом трафике (плохой пример, но это первое что пришло в голову). Я не рассматриваю тут деревья, только un_ordered_map, unordered_set.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 21:43
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Подмешивание псевдослучайных
Подмешать не проблема. Как доставать обратно будете?
Цитата Сообщение от Pechkin80 Посмотреть сообщение
когда стало много одинаковых данных,
это значит настало горе. Одинаковые данные нельзя отличить потому, что они неотличимы. Нужно вначале изучить данные и найти способ их описания. Например цвет (в палитре охотника за фазанами) не очень хорошая характеристика для описания огурцов. Вес, длина, количество пупырышек, - в сочетании, могут дать более приличный результат.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 21:54  [ТС]
IGPIGP, Данные случайны. Нельзя их изучить. Зато надо управлять ситуаций. "Горе" это не инженерный термин.
Сами по себе структуры unordered_map/set данных без инструментов работы с ними, вызывают опаску. Както нужно вовремя бяку обнаружить или предотвращать. Подмешивание в общем случае может быть трёхкомпонентным. Первый компонент - постоянная случайная константа, второй компонент периодическая константа из масссива констант (изменяемая циклически по модулю) и третья компонента это случайное число для конкретного элемента, которое хранится вместе с хешем. Также нужен инструментарий обнаружения коллизий. Третья компонента конечно делает ненужным первые две компоненты.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 21:55
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Суть в то что пространство ключей меньше пространства данных.
То есть предполагается, что мало того, что есть коллизии собственно по хэш-таблице, но ещё и одному и тому же ключу соответствует несколько наборов данных?

Тогда по какому условию эти данные различаются, и кто будет заниматься высвобождением таблицы от них?

Так-то предположу что это должно быть что-то наподобие хэш-таблицы списков.

А вообще в этом случае нужно изменять алгоритм построения ключа.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 22:02  [ТС]
Цитата Сообщение от TRam_
То есть предполагается, что мало того, что есть коллизии собственно по хэш-таблице, но ещё и одному и тому же ключу соответствует несколько наборов данных?

Тогда по какому условию эти данные различаются, и кто будет заниматься высвобождением таблицы от них?

Так-то предположу что это должно быть что-то наподобие хэш-таблицы списков.

А вообще в этом случае нужно изменять алгоритм построения ключа.
Однозначное соответствие может быть для мгновенного слепка хеш-таблицы, но может не быть для пространств ключей и данных.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2017, 22:06
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Данные случайны. Нельзя их изучить.
Постановка, - "хранить что угодно" далека от специфики вопроса. В идеале, предикаты сравнения, это не менее ценные данные класса, чем его прямые свойства. Если хватит терпения, попробуйте взглянуть в мой блог. Там есть статейка о поиске и хранении.
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Подмешивание в общем случае может быть
Такие вещи как ассоциативные массивы это структуры "саморазмещаемых" данных. Подмешивая немного случайной информации можно получить лишь немного случайное размещение. Тут как говорил бы Матроскин (кот), открывается дорога к тому, чтобы найти что нибудь случайное. Без знания данных, нет задачи. То есть её качество определяется качеством информации о данных. Представьте, вопрос типа "Нужно хранить данные о людях о описании которых ни чего не известно". Вряд ли тут есть ответ.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 22:07
Pechkin80, а запрашивать данные тогда как собираетесь? Наподобие
"найти машину белого цвета "Лада Калина" " - и вываливается список из нескольких десятков тысяч "лад калин" с данными о них. Что со списком-то делать будете?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.11.2017, 22:09
То, что ты описываешь сводится к одному - не используй хеш таблицы. Профессионализм в том и заключается, чтобы понять какая структура данных тебе нужна. std::unordered_map не универсален и нужен лишь для ограниченного круга задач. И вот когда он действительно нужен ты рад, что разработчики компилятора (и языка) тебе предоставили готовое решение.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 22:23  [ТС]
TRam_, Если программа заточена под конкретный тип данных, то это уже минус. Я не спорю, что никакая структура данных не является универсальной и надо выбирать структуру данных в зависимости от природы данных, но давайте не уводить обсуждение в сторону. Мне интересно знать есть ли готовый инструментарий работы с unordered_map/unordered_set а не философски разговоры о смысли жизни ?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 22:46
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Мне интересно знать есть ли готовый инструментарий работы с unordered_map
Естественно. В шаблоне http://www.cplusplus.com/refer... dered_map/ имеется третьим параметром шаблона class Hash, который создаёшь и в котором нужно только переопределить
operator()
Returns a hash value for its argument, as a value of type size_t.
size_t is an unsigned integral type.
который должен генерироваться из того, что используется в качестве ключа (т.е. неких данных, по которым собственно будет производиться поиск основного набора данных).

Обработка коллизий будет сделана автоматически. Но останется условие, что задав один ключ найдётся один набор данных. Или вставится/обновится один набор данных.


Случай 2, что нам надо для одного и того же ключа набирать много наборов данных. Тогда для unordered_map аргументом class T должен быть list<DataType>, т.е. по ключу получаете ссылку на список, и далее с этим списком поэлементно работаете. Роясь в данных, которые насобирали для этого ключа.

Добавлено через 7 минут
Если данные имеют неизвестный размер и каждый раз разное содержимое, внутри у DataType должен быть некий идентификатор содержимого (ведь нужно же знать, как и в каком порядке обрабатывать), указатель на содержимое (которое динамически выделено) и, если нужно, размер этого выделенного содержимого.

Всё. Можно заполнять и радоваться. Но не забыть сделать систему очистки от вышеупомянутого динамически выделенного содержимого, а остальное, в основном, контейнеры сгенерируют за вас. И удаление по ключу, и удаление по ключу и собственно итератору к контейнеру данных, и добавление/удаление "пустого"/"не пустого" списка или элемента списка.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 22:50  [ТС]
TRam_, Спасибо, но мало, хотя использовать свой хеш тоже важно. Вот есть уже готовый unordered_map, который стоит себе в программе. Может даже его какой то разработчик ошибочно поставил и он нахрен не нужен, а программа тормозит. Вот задача провести диагностику и выявить действительно ли unordered_map был использован не по назначению или ключ выбран неудачно и что появилось много коллизий. А что касается кастомной хеш-функции, то её неплохо бы сделать дружественной (если уже не сделали). Чтобы она могла подмешивать, в зависимости от индекса массива по модулю Х.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 23:00
Pechkin80, Создается впечатление, что вы вообще не понисаете, как работает хэш таблица.

Задача: Найти в таблице по ключу (ключ - строка "Вася Пупкин") данные о нем.

У вас есть только строка "Вася Пупкин". Откуда вы возьмете свои случайные подмешанные данные?
C++
1
2
int salt=?; //?
mymap.find("Вася Пупкин", salt)
1
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
25.11.2017, 23:05  [ТС]
avgoor, Ну это не центральный вопрос про подмешивание. Потом подробно объясню и наверно даже скетч какойнить накатаю чтобы лучше было понятно, что я имею ввиду.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
25.11.2017, 23:08
Pechkin80, по поводу диагностики - http://www.cplusplus.com/refer... ad_factor/

Чем меньше будет этот коэффициент, тем больше будет места хэш-таблицы приходиться на 1 пару элементов, тем меньше будет вероятность коллизий. Попробуйте поставить что-то наподобие 0.5 или вовсе 0.1 (на 1 добавляемый элемент будет приходиться 10 свободных мест, т.е. очень мала вероятность коллизий). Но это повлечёт увеличение расходов памяти на собственно таблицу. Значительно.

Проверять "степень заполнения" с помощью http://www.cplusplus.com/refer... ad_factor/

Цитата Сообщение от Pechkin80 Посмотреть сообщение
А что касается кастомной хеш-функции, то её неплохо бы сделать дружественной
К кому дружественной? для данного контейнера, как уже выше написал, хэш-функцимя должна быть выполнена в виде operator(), внутри класса, передаваемого вторым параметром шаблона. Так что дружественным надо назначать класс с этим оператором.

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

Решение

Цитата Сообщение от Pechkin80 Посмотреть сообщение
но как найти коллизию в конкретном месте
http://www.cplusplus.com/refer... cket_size/ - пожалуйста. С примером вывода на экран.

Добавлено через 49 секунд
Просто я абсолютно не уверен, что тормоза программы связаны именно с коллизиями.
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
25.11.2017, 23:24
Цитата Сообщение от Pechkin80 Посмотреть сообщение
но как найти коллизию в конкретном месте
Зачем? Есть коллизия. Что вы будете делать с этой информацией? Нет коллизии - что дальше? Зачем вообще это нужно?
При любой адекватной хэш функции (при равномерном распределении) вероятность коллизий одна и та же.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2017, 23:24

Контейнер 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 чтобы достичь максимального быстродействия. ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru