HashSet <T> против словаря <K, V> w.r.t время поиска, чтобы определить, существует ли элемент

HashSet<T> t = new HashSet<T>();
// add 10 million items


Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.

Чей метод .Contains вернется быстрее?

Просто, чтобы уточнить, мое требование состоит в том, что у меня есть 10 миллионов объектов (ну, действительно, строки), которые мне нужно проверить, существуют ли они в структуре данных. Я НИКОГДА не буду повторять.

Ответ 1

HashSet vs List vs Тест производительности словаря, взятый из здесь.

Добавить 1000000 объектов (без проверки дубликатов)

Содержит проверку для половины объектов коллекции из 10000

Удалите половину объектов коллекции из 10000

Ответ 2

Я предполагаю, что вы имеете в виду Dictionary<TKey, TValue> во втором случае? HashTable - это не общий класс.

Вы должны выбрать нужную коллекцию для задания на основе ваших фактических требований. Вы действительно хотите сопоставить каждый ключ со значением? Если это так, используйте Dictionary<,>. Если вы только заботитесь о нем как о наборе, используйте HashSet<>.

Я ожидал бы HashSet<T>.Contains и Dictionary<TKey, TValue>.ContainsKey (которые являются сопоставимыми операциями, предполагая, что вы используете ваш словарь разумно), чтобы в основном выполнять то же самое - они используют один и тот же алгоритм, в принципе. Я полагаю, что с более крупными записями Dictionary<,> вы получите большую вероятность сжечь кеш с помощью Dictionary<,>, чем с помощью HashSet<>, но я ожидаю, что это будет незначительным по сравнению с болью при выборе неправильных данных типа просто с точки зрения того, чего вы пытаетесь достичь.

Ответ 3

Это разные структуры данных. Также нет универсальной версии HashTable.

HashSet содержит значения типа T, которые HashTable (или Dictionary) содержат пары ключ-значение. Поэтому вы должны выбрать коллекцию, какие данные вам нужно сохранить.

Ответ 4

Из документации MSDN для словаря < TKey, TValue >

"Получение значения с помощью его ключа очень быстро, близко к O (1), потому что класс словаря реализован как хеш-таблица."

С примечанием:

"Скорость поиска зависит от качества алгоритма хэширования типа, указанного для TKey"

Я знаю, что ваш вопрос/сообщение старый - но, ища ответ на аналогичный вопрос, я наткнулся на это.

Надеюсь, это поможет. Для более подробной информации прокрутите страницу до Примечания. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx