2014-05-12 3 views
2

У меня есть hashmap, содержащий около полумиллиона записей, ключ - это строка, значения которой представлены как комбинация из 5 разных входов. (конкатенация строк) область каждого входа мало, но комбинация из 5 входов дает эту огромную карту (500 тыс. элементов). Теперь я думаю об оптимизации этой структуры.Оптимизация реализации HashMap

Моей идеей является хэш-вход (комбинация из 5 входов) путем хэширования каждого отдельного входа и объединения этих 5 хэшей в один единственный хэш (int 32 или 64), а затем поиск этого хеша.

Мой вопрос: существует ли известная структура данных, которая может хорошо справиться с этой ситуацией? и стоит ли делать эту оптимизацию? Я хочу оптимизировать как память, так и время выполнения.

Я использую C++ и std::unordered_map ключ - это комбинированная строка из 5 входов, а выход случайный. Я не нашел никакой связи между входами и выходами (случайными или последовательными).

125 458 699 sadsadasd 5 => 56. 
125 458 699 sadsadasd 3 => 57. 
125 458 699 sadsadasd 4 => 58. 
125 458 699 sadsadasd 5 => 25. 
125 458 699 gsdfsds 3 => 89. 

домен каждого из входов мал (4-й вход имеет различные значения 2K в то время как другие входные сигналы могут иметь только о 20 различных значений).

+0

Что вы подразумеваете под «структурой данных»? Вы ищете хорошую функцию для объединения нескольких значений хэша в один хэш? – Sneftel

+0

Является ли хеширование конкатенации действительно тем, что отличается от хэширования 5 входов, а затем каким-то образом их объединяет? Что заставляет вас думать, что это будет более оптимальным? – David

+0

@Sneftel, возможно, другая структура данных, такая как дерево или хеширующая функция, мой план состоит в том, чтобы использовать 5 хэш-карт для каждого входа, чтобы получить 5 хешей, а затем объединить 5 хэшей в один хэш. но есть ли другая структура данных? и стоит ли это делать? – mmohab

ответ

1

Вы можете использовать GNU perf для создания идеальной хэш-функции для ваших ключей.

+0

+1 для GNU perf, будет полезно для моего случая, потому что у меня уже есть ключи. – mmohab

0

Мне кажется, что нет способа уменьшить размер ваших ключей, что приведет к надежному извлечению. Хеширование 5 входов в 1 целое - это односторонняя функция, которая предотвратит выполнение надежных поисков.

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

Я думаю, что вам лучше всего использовать std::tuple<int, int, int, std::string, int> как тип ключа на одной карте.

Если вы используете std::map<tuple<>, data_type>, вам не нужно будет предоставлять функцию хеширования. Если вы остаетесь с unordered_map, вам необходимо предоставить его с std::tuple, не имеет специализации по умолчанию hash<>.

Смежные вопросы