#c #c 11 #hash #unordered-map
#c #c 11 #хэш #неупорядоченный-карта
Вопрос:
Я решаю проблему, часть которой требует от меня преобразования массива в хэш-таблицу, но массив может содержать дубликаты.
Теперь, если бы не было дубликатов, я мог бы просто сделать :-
unordered_map<int,int>hash;
for(int i=0; i<size; i ){
hash[arr[i]] = arr[i];
}
но я не уверен, что делать в случае повторяющихся ключей и значений.
Любая помощь будет высоко оценена.
Комментарии:
1. вы хэшируете int?
2. Это
hash[arr[i]] = arr[i]
то, что вы на самом деле хотите здесь сделать? Если значение и ключ — это одно и то же, почему бы не использоватьmultiset
илиunodered_multiset
?3. Является ли назначение вашего ключа хэш-таблицы порядковым номером массива или значением, хранящимся в этом порядковом номере? Похоже , вы хотите использовать значение. Ответ на этот вопрос очень важен для того, как вы это делаете. Если hashmap просто вводит значение массива, вы можете накапливать количество вхождений просто
hash[arr[i]];
в своем цикле, а не в том, что у вас есть сейчас.
Ответ №1:
Это зависит от того, чего вы хотите достичь. Используйте std::unordered_multimap
. Или подсчитайте количество повторений и сохраните его в значении map.
Ответ №2:
Для нетривиальных хэшей; экземпляр, который был хэширован, обычно сохраняется вместе с хэшем.
Это позволяет ==
проверять или <
после хэша. Если есть коллизия, где hash(a) == hash(b)
amp;amp; a != b
, то вы либо изменяете хэш так, чтобы коллизии больше не существовало, либо используете hash -> vector; или некоторую комбинацию из 2. Зависит от того, для чего именно вы хотите использовать хэш.