HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
Czyja .Contains
metoda zwróci się szybciej?
Dla wyjaśnienia, moim wymaganiem jest to, że mam 10 milionów obiektów (cóż, ciągów znaków), które muszę sprawdzić, czy istnieją w strukturze danych. NIGDY nie będę iterował.
.net
performance
dictionary
hashset
halivingston
źródło
źródło
Odpowiedzi:
Test wydajności HashSet vs List vs Dictionary, pobrany stąd .
Dodaj 1000000 obiektów (bez sprawdzania duplikatów)
Zawiera czek na połowę obiektów z kolekcji 10000
Usuń połowę obiektów z kolekcji 10000
źródło
Zakładam, że masz na myśli
Dictionary<TKey, TValue>
w drugim przypadku?HashTable
nie jest klasą ogólną.Należy wybrać odpowiednią kolekcję do pracy w oparciu o rzeczywiste wymagania. Czy faktycznie chcesz zamapować każdy klucz na wartość? Jeśli tak, użyj
Dictionary<,>
. Jeśli zależy Ci tylko na zestawie, użyjHashSet<>
.Spodziewałbym się
HashSet<T>.Contains
iDictionary<TKey, TValue>.ContainsKey
(które są porównywalnymi operacjami, zakładając, że rozsądnie używasz swojego słownika), zasadniczo wykonają to samo - używają zasadniczo tego samego algorytmu. Wydaje mi się, że przyDictionary<,>
większych wpisach kończy się większe prawdopodobieństwo wysadzenia pamięci podręcznejDictionary<,>
niż zHashSet<>
, ale spodziewałbym się, że będzie to nieistotne w porównaniu z bólem związanym z wyborem niewłaściwego typu danych po prostu pod względem tego, czym jesteś próbując osiągnąć.źródło
Dictionary
innych powodów, powinieneś użyć tego.Z dokumentacji MSDN dla Dictionary <TKey, TValue>
Z dopiskiem:
Wiem, że Twoje pytanie / post jest stare - ale szukając odpowiedzi na podobne pytanie, natknąłem się na to.
Mam nadzieję że to pomoże. Przewiń w dół do sekcji Uwagi, aby uzyskać więcej informacji. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
źródło
To są różne struktury danych. Nie ma również ogólnej wersji
HashTable
.HashSet
zawiera wartości typu T, któreHashTable
(lubDictionary
) zawierają pary klucz-wartość. Dlatego powinieneś wybrać zbiór, na jakich danych chcesz przechowywać.źródło
Przyjęta odpowiedź na to pytanie NIE daje ważnej odpowiedzi na pytanie! Zdarza się, że daje poprawną odpowiedź, ale nie wynika to z przedstawionych przez nich dowodów.
Ta odpowiedź pokazuje, że wyszukiwanie kluczy na a
Dictionary
lubHashSet
jest znacznie szybsze niż wyszukiwanie wList
. Co jest prawdą, ale nie jest interesujące, ani zaskakujące, ani dowodem na to, że mają taką samą prędkość.Uruchomiłem poniższy kod, aby porównać czasy wyszukiwania i dochodzę do wniosku, że w rzeczywistości SĄ one tą samą prędkością. (Lub przynajmniej, jeśli jest jakaś różnica, to różnica mieści się w granicach odchylenia standardowego tej prędkości)
Konkretnie, 100 000 000 wyszukiwań trwało od 10 do 11,5 sekundy w obu przypadkach w tym teście.
Kod testu:
źródło