Как создать хэш из массива с повторяющимися значениями

#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. Зависит от того, для чего именно вы хотите использовать хэш.