Podwójne haszowanie

Podwójne haszowanie to technika programowania komputerowego używana w połączeniu z otwartym adresowaniem w tablicach skrótów w celu rozwiązywania kolizji skrótów , przy użyciu wtórnego skrótu klucza jako przesunięcia w przypadku wystąpienia kolizji. Podwójne mieszanie z otwartym adresowaniem to klasyczna struktura danych w tabeli .

Technika podwójnego haszowania wykorzystuje jedną wartość skrótu jako indeks w tabeli, a następnie wielokrotnie przechodzi do przodu o przedział, aż do znalezienia żądanej wartości, osiągnięcia pustej lokalizacji lub przeszukania całej tabeli; ale ten przedział jest ustalany przez drugą, niezależną funkcję mieszającą . W przeciwieństwie do alternatywnych metod rozwiązywania kolizji sondowania liniowego i kwadratowego , interwał zależy od danych, więc wartości mapowane do tej samej lokalizacji mają różne sekwencje przedziałów; minimalizuje to powtarzające się kolizje i skutki grupowania.

dwie losowe, jednolite i niezależne funkcje skrótu i , to w sekwencji wiadra dla wartości w tablicy skrótów wiadra to: \ i są z zestawu funkcji mieszających ; jest wybrany tak, aby miał zakres i mieć zakres . Podwójne mieszanie przybliża rozkład losowy; niezależne parami funkcje skrótu dają prawdopodobieństwo, będzie podążać za tą

Wybór h 2 (k)

Wtórna funkcja skrótu powinna mieć kilka cech:

  • nigdy nie powinien dawać indeksu równego zero
  • powinien przechodzić przez całą tabelę
  • powinno być bardzo szybkie do obliczenia
  • powinno być parami niezależne od
  • dystrybucji . Jest to analogiczne do generatora liczb losowych.
  • być względnie pierwsze do | T |.

W praktyce:

  • Jeśli mieszanie dzielenia jest używane dla obu funkcji, dzielniki są wybierane jako liczby pierwsze.
  • Jeśli T potęgą 2, pierwsze i ostatnie wymagania są zwykle spełnione, powodując, że nieparzystą Ma to efekt uboczny w postaci podwojenia szansy na kolizję z powodu jednego zmarnowanego bitu.

Analiza

Niech będzie liczbą elementów przechowywanych w a następnie współczynnik obciążenia . To znaczy i niezależnego wybrania dwóch funkcji mieszających i podwójną . Wszystkie są umieszczane w przy użyciu i . Biorąc pod uwagę klucz , -st lokalizacja skrótu jest obliczana przez:

Niech mają współczynnik obciążenia . Bradford i Katehakis wykazali, że oczekiwana liczba sond do nieudanego wyszukiwania w używając tych początkowo wybranych funkcji skrótu, wynosi niezależnie od rozkładu wejść. Wystarczy parami niezależność funkcji skrótu.

Podobnie jak wszystkie inne formy otwartego adresowania, podwójne mieszanie staje się liniowe, gdy tablica mieszająca zbliża się do maksymalnej pojemności. Zwykła heurystyka polega na ograniczeniu ładowania tabeli do 75% pojemności. W końcu konieczne będzie ponowne haszowanie do większego rozmiaru, tak jak w przypadku wszystkich innych otwartych schematów adresowania.

Warianty

wskazuje, że podwójne mieszanie daje niepożądane równoważne funkcje mieszające, gdy Blooma : i , wtedy i zbiory skróty są identyczne. To sprawia, że ​​kolizja jest dwa razy bardziej prawdopodobna niż oczekiwana .

Istnieje dodatkowo znaczna liczba w większości nakładających się zestawów skrótów; jeśli i , a następnie zakresu nie pomaga.

Potrójne haszowanie

Dodanie wyrażenia kwadratowego ( liczba trójkątna ) lub nawet ( potrójne haszowanie ) do funkcji skrótu nieco poprawia funkcję skrótu, ale nie rozwiązuje tego problemu; Jeśli:

i

Następnie

Ulepszone podwójne haszowanie

Dodanie terminu sześciennego ( problem, Displaystyle ^ technika znana jako ulepszone podwójne mieszanie . Można to skutecznie obliczyć przez różnicowanie w przód :

 	

          






          

	        

	   0      
		  
		  	
		  	
		       	
	
 klucz  struktury  ;  /// Nieprzezroczyste  /// W razie potrzeby użyj innych typów danych. (Musi być unsigned dla gwarantowanego zawijania.)   extern  unsigned  int  h1  (  struct  key  const  *  ),  h2  (  struct  key  const  *  );  /// Oblicz wartości skrótu k z dwóch bazowych funkcji skrótu  /// h1() i h2() przy użyciu ulepszonego podwójnego skrótu. Po powrocie   /// hasze[i] = h1(x) + i*h2(x) + (i*i*i - i)/6.  /// Korzysta z automatycznego zawijania (redukcji modułowej)  /// typów bez znaku w C.  void  ext_dbl_hash  (  struct  key  const  *  x  ,  unsigned  int  hashes  [],  unsigned  int  n  )  {  unsigned  int  a  =  h1  (  x  ),  b  =  h2  (  x  ),  ja  ;  dla  (  ja  =  ;  ja  <  n  ;  ja  ++  )  {  hasze  [  ja  ]  =  za  ;  za  +=  b  ;  // Dodaj kwadratową różnicę, aby otrzymać sześcienny  b  +=  i  ;  // Dodaj różnicę liniową, aby otrzymać kwadratową  // i++ dodaje stałą różnicę, aby otrzymać liniową  }  } 

Oprócz rozwiązania problemu kolizji, ulepszone podwójne mieszanie usuwa również ograniczenia numeryczne podwójnego mieszania dotyczące mieszania podobną pod względem właściwości do ( niezależnie od) do użycia.

Zobacz też

Linki zewnętrzne