Musisz trochę wykopać, aby zobaczyć, jak słownik jest implementowany w C # - Nie jest to tak oczywiste, jak HashMap (tabela skrótów) lub TreeMap (posortowane drzewo) (lub ConcurrentSkipListMap - lista pominięć ).
Jeśli zagłębisz się w sekcję „Uwagi”:
Klasa ogólna Dictionary zapewnia mapowanie z zestawu kluczy na zestaw wartości. Każde dodanie do słownika składa się z wartości i związanego z nią klucza. Pobieranie wartości za pomocą jej klucza jest bardzo szybkie, zbliżone do O (1), ponieważ klasa Dictionary jest zaimplementowana jako tablica skrótów.
Mamy to. To jest tablica skrótów . Zauważ, że podłączyłem tam artykuł z Wikipedii - jest to dość dobra lektura. Możesz przeczytać sekcję dotyczącą rozwiązywania kolizji. Możliwe jest uzyskanie patologicznego zestawu danych, w którym wyszukiwanie przechodzi do O (N) (na przykład wszystko, co wstawisz, spada z tej samej wartości skrótu lub indeksu w tabeli skrótów z jakiegoś powodu i pozostaje ci liniowe sondowanie ).
Chociaż Słownik jest rozwiązaniem ogólnego zastosowania, nie powinieneś omijać konkretnych typów (takich jak Słownik) - powinieneś omijać interfejsy. W tym przypadku jest to interfejs IDictionary
( docs ). W tym celu jesteś w stanie napisać własną implementację słownika, która optymalnie dostosowuje się do posiadanych danych.
Co do skuteczności różnych wyszukiwania / zawiera?
- Zwiedzanie nieposortowanej listy: O (N)
- Wyszukiwanie binarne posortowanej tablicy: O (log N)
- Posortowane drzewo: O (log N)
- Tabela skrótów: O (1)
Dla większości ludzi tabela skrótów jest tym, czego chcą.
Może się okazać, że SortedDictionary jest tym, czego chcesz:
SortedDictionary<TKey, TValue>
Klasa rodzajowy jest wyszukiwanie binarne drzewo z O (log n) pobierania, gdzie n jest liczbą elementów w słowniku. Pod tym względem jest podobny do SortedList<TKey, TValue>
klasy ogólnej. Dwie klasy mają podobne modele obiektowe i obie mają pobieranie O (log n).
Chociaż znowu, jeśli struktura danych nie jest idealna dla twoich danych, masz narzędzia (interfejsy), aby móc napisać takie, które najlepiej pasują do twoich danych.
Sam słownik jest abstrakcyjnym typem danych . Dajesz mi Słownik, a ja wiem, co mogę z tym zrobić i wszystkie dostępne tam narzędzia, których mogę używać, ponieważ jest to Słownik. Gdybyś podał mi ArrayList, pisałbym własny kod do wyszukiwania, wstawiania lub usuwania elementów z listy. To marnuje mój czas, a także oznacza, że istnieje większe prawdopodobieństwo błędu, ponieważ kopiuję kod raz po raz z miejsca na miejsce.
Data Structures
ten link do wiki, który może ci pomóc