Sondowanie kwadratowe

Sondowanie kwadratowe to otwarty schemat adresowania w programowaniu komputerowym służący do rozwiązywania kolizji skrótów w tablicach mieszania . Sondowanie kwadratowe polega na pobraniu pierwotnego indeksu skrótu i ​​dodaniu kolejnych wartości dowolnego wielomianu kwadratowego , aż do znalezienia wolnego miejsca.

Przykładowa sekwencja wykorzystująca sondowanie kwadratowe to:

Sondowanie kwadratowe może być bardziej wydajnym algorytmem w otwartej tablicy adresowania , ponieważ lepiej pozwala uniknąć problemu grupowania, który może wystąpić w przypadku sondowania liniowego , chociaż nie jest odporne. Zapewnia również dobre buforowanie pamięci, ponieważ zachowuje pewną lokalizację odniesienia ; jednakże sondowanie liniowe ma większą lokalność, a tym samym lepszą wydajność pamięci podręcznej. [ wątpliwe ] [ potrzebne źródło ]

Funkcja kwadratowa

Niech h ( k ) będzie funkcją skrótu odwzorowującą element k na liczbę całkowitą w [0, m −1], gdzie m jest rozmiarem tabeli. Niech i -ta pozycja sondy dla wartości k będzie dana funkcją

gdzie c 2 ≠ 0 (Jeśli c 2 = 0, to h ( k , i ) ulega degradacji do sondy liniowej ). Dla danej tablicy mieszającej wartości c 1 i c 2 pozostają stałe.

Przykłady:

  • Jeśli , wówczas sekwencja sondująca będzie następująca:
  • Dla m = 2 n dobrym wyborem stałych są c 1 = do 2 = 1/2, ponieważ wartości h ( k , i ) dla i w [0, m −1] są różne. Prowadzi to do sekwencji próbnej liczby trójkątne ), gdzie wartości rosną o 1, 2, 3, . ..
  • Dla liczby pierwszej m > 2 większość wyborów c1 i c2 sprawi, że h ( k , i ) będzie odrębne dla i w [0, ( m −1)/2]. Takie wybory obejmują c 1 = c 2 = 1/2, c 1 = c 2 = 1 i c 1 = 0, c 2 = 1. Jednak jest tylko m /2 różne sondy dla danego elementu, wymagające innych technik, aby zagwarantować, że wstawienie zakończy się sukcesem, gdy współczynnik obciążenia przekroczy 1/2.
  • Dla , gdzie i p równymi 2 (degraduje się do sondy liniowej, gdy = 1) , to = daje cykl wszystkich odrębnych sond. Można to obliczyć w pętli jako: i
  • Dla dowolnego m pełny cykl z sondowaniem kwadratowym można osiągnąć poprzez zaokrąglenie m do najbliższej potęgi 2, obliczyć indeks sondy: gdy . Jest maksimum pominięto iteracje, a iteracje te nie odnoszą się do pamięci, więc jest to szybkie działanie na większości nowoczesnych procesorów. Zaokrąglenie m można obliczyć w następujący sposób:
  
	
	    
	    
	    
	    
	    
	    
	 uint64_t  roundUp2  (  uint64_t  v  ){  v  --  ;  v  |=  v  >>  1  ;  v  |=  v  >>  2  ;  v  |=  v  >>  4  ;  v  |=  v  >>  8  ;  v  |=  v  >>  16  ;  v  |=  v  >>  32  ;  v  ++  ; 
	 
 powrót  v  ;  } 

Ograniczenia

Znaki naprzemienne

Jeśli znak przesunięcia jest naprzemienny (np. +1, -4, +9, -16 itd.) i jeśli liczba segmentów jest liczbą pierwszą przystającą do 3 modulo 4 (np. 3) 7, 11, 19, 23, 31 itd.), wówczas pierwsze będą unikalne ( . [ potrzebne dalsze wyjaśnienia Innymi słowy, uzyskuje się permutację od 0 do

Linki zewnętrzne