2011-09-16 6 views

Odpowiedz

15

To wszystko jest opisane w niniejszym opracowaniu na MSDN: An Extensive Examination of Data Structures Using C# 2.0

... kolizja technika zwana rehasing rozdzielczości, która jest techniką wykorzystywane przez klasy Hashtable ramową w .NET. W końcowej sekcji zajmiemy się klasą Dictionary, która używa techniki kolizji znającej łańcuch. ....

... Rehasing działa w następujący sposób: jest to zestaw hash różnych funkcji, H1 ... Hn, a podczas wkładania lub pobierania elementu z tabeli mieszania, początkowo hash H1 funkcja jest używana. Jeśli doprowadzi to do kolizji, zamiast tego zostanie wypróbowana metoda H2, aw razie potrzeby zostanie zwiększona do wartości Hn. W poprzedniej sekcji pokazano tylko jedną funkcję skrótu, która jest początkową funkcją haszującą (H1) . Pozostałe funkcje skrótu są bardzo podobne do tej funkcji, różnicując je tylko przez współczynnik multiplikatywny. W ogóle, funkcja skrótu Hk jest zdefiniowany jako:

Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize 

Dictionary grupa różni się od Hashtable klasie sposobów więcej niż jeden. Oprócz tego, że słownik jest silnie napisany, słownik używa także innej strategii rozwiązywania kolizji niż klasa Hashtable , stosując technikę zwaną łańcuchem. Przypomnij sobie, że przy sondowaniu , w razie kolizji wypróbowane jest inne miejsce na liście łyżek . (Po ponownym wprowadzeniu skrótu hasz zostanie ponownie obliczony i zostanie wypróbowany nowy slot.) Jednak przy łańcuchowaniu wykorzystywana jest drugorzędna struktura danych do przechowywania kolizji. Konkretnie, każde gniazdo w Słowniku ma tablicę elementów, które są odwzorowane na to wiadro. W zdarzeniu kolizji element kolizyjny jest dodawany do listy wiaderek .

Pamiętaj tylko pierwsze zdanie jest moja własna :-)

+0

"Słownik" nie ma struktury danych dodatkowych do przechowywania kolizji. Przynajmniej w C# 4 tak nie jest. – Gabe

+0

@Gabe: Czy możesz podać inne wyjaśnienie lub link? – Seb

+0

@Gabe: Czy mógłbyś rozwinąć? Wygląda to na całkiem dokładny opis 'Dictionary ' do mnie. Rozumiem, że każdy element zawiera listę elementów połączonych (aw przypadku braku kolizji lista połączona zawiera pojedynczy element). – LukeH

5

To rzeczywiście bardzo ciekawe pytanie; Właśnie zrobiłem blog post o tym, jak Dictionary zaimplementowano za kulisami. Mogę pokryć Hashtable w późniejszym.

+0

To bardzo miłe. W swojej odpowiedzi powinieneś zamieścić podsumowanie. – Gabe

+0

Potrzebuje diagramów, aby wyjaśnić to poprawnie; Nie jestem pewien, czy potrafię to podsumować w odpowiedni sposób ...:/ – thecoop

+0

W każdym razie, dołącz schematy. Możesz przesyłać obrazy, naciskając Ctrl + G. – Gabe

Powiązane problemy