Я пытаюсь настроить хеш-таблицу (на C++, используя контейнер unordered_map), который должен содержать 1875 целых элементов, которые распределены случайным образом в интервале от 0 до 4891. Теперь моя проблема в том, что распределение внутри этого интервала не является равномерным, а скорее выглядит следующим образом: Хэш-функция для кластеризованных целых чисел
, где каждые из 1875 случайных чисел на графике как точки с й, соответствующими целым значением и у = 1 (так, чтобы визуализировать распределение) ,
Очевидно, что распределение таково, что существуют широкие пробелы, где ни одно случайное целое не лежит. Если я использую функцию идентификации как мою хеш-функцию (т. Е. Использую случайные целые числа сами по себе как хэш-значения), я получаю 714 пустых ведер, 814 ведер с одним элементом, 499 ведер с 2 элементами и 21 ведро с 3 или более элементами.
Я использую компилятор Intel C++, и он использует полномочия 2 для количества ведер в хеш-таблице. В моем случае прямо сейчас хэш-таблица имеет 2^11 = 2048 ковшей.
Что было бы хорошей хэш-функцией для этого случая? Я понимаю, что хорошая хеш-функция в этом случае избавится от этих кластеризованных целых чисел и перетасует их в более равномерное распределение, но как это можно добиться?
Значит, у вас всего 1800 целых чисел? Как насчет отсортированного 'std :: vector' из пар ключей с ключом 1800, а затем двоичного поиска через него? Это, по крайней мере, стоит измерить. –
Boost's 'flat_map' [(обзор)] (http://www.boost.org/doc/libs/1_59_0/doc/html/container/non_standard_containers.html#container.non_standard_containers.flat_xxx) [(API docs)] (http://www.boost.org/doc/libs/1_59_0/doc/html/boost/container/flat_map.html) - это хорошая, полная реализация того, что предлагает @BaummitAugen - его интерфейс похож на unordered_map, но это реализован как упорядоченный вектор. –
Прохладные предложения, я действительно не знал об отсортированных векторах. Но, как бинарное дерево, я понимаю, что для отсортированных векторов и бинарных деревьев операция поиска масштабируется как O (log n). Допустим, что мне нужна эта структура данных для масштабирования до гораздо большего числа и все еще есть O (1) поисковые запросы. – user3208430