Ответ 1
HashSet vs List vs Тест производительности словаря, взятый из здесь.
Добавить 1000000 объектов (без проверки дубликатов)
Содержит проверку для половины объектов коллекции из 10000
Удалите половину объектов коллекции из 10000
HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
Чей метод .Contains
вернется быстрее?
Просто, чтобы уточнить, мое требование состоит в том, что у меня есть 10 миллионов объектов (ну, действительно, строки), которые мне нужно проверить, существуют ли они в структуре данных. Я НИКОГДА не буду повторять.
HashSet vs List vs Тест производительности словаря, взятый из здесь.
Добавить 1000000 объектов (без проверки дубликатов)
Содержит проверку для половины объектов коллекции из 10000
Удалите половину объектов коллекции из 10000
Я предполагаю, что вы имеете в виду Dictionary<TKey, TValue>
во втором случае? HashTable
- это не общий класс.
Вы должны выбрать нужную коллекцию для задания на основе ваших фактических требований. Вы действительно хотите сопоставить каждый ключ со значением? Если это так, используйте Dictionary<,>
. Если вы только заботитесь о нем как о наборе, используйте HashSet<>
.
Я ожидал бы HashSet<T>.Contains
и Dictionary<TKey, TValue>.ContainsKey
(которые являются сопоставимыми операциями, предполагая, что вы используете ваш словарь разумно), чтобы в основном выполнять то же самое - они используют один и тот же алгоритм, в принципе. Я полагаю, что с более крупными записями Dictionary<,>
вы получите большую вероятность сжечь кеш с помощью Dictionary<,>
, чем с помощью HashSet<>
, но я ожидаю, что это будет незначительным по сравнению с болью при выборе неправильных данных типа просто с точки зрения того, чего вы пытаетесь достичь.
Это разные структуры данных. Также нет универсальной версии HashTable
.
HashSet
содержит значения типа T, которые HashTable
(или Dictionary
) содержат пары ключ-значение. Поэтому вы должны выбрать коллекцию, какие данные вам нужно сохранить.
Из документации MSDN для словаря < TKey, TValue >
"Получение значения с помощью его ключа очень быстро, близко к O (1), потому что класс словаря реализован как хеш-таблица."
С примечанием:
"Скорость поиска зависит от качества алгоритма хэширования типа, указанного для TKey"
Я знаю, что ваш вопрос/сообщение старый - но, ища ответ на аналогичный вопрос, я наткнулся на это.
Надеюсь, это поможет. Для более подробной информации прокрутите страницу до Примечания. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx