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