Tablice z haszowaniem - funkcje, haszowanie łańcuchowe

Haszowanie metodą łańcuchową

Sposób przechowywania danych w tabeli T:

procedury

Procedury potrzebne do "obsługi" tablicy z haszowaniem:

procedury

Funkcje haszujące

Najpopularniejsze funkcje haszujące:

procedury

Uwaga! W przypadku haszowania modularnego warto zadbać, by m było liczbą pierwszą (plik z liczbami pierwszymi). W przypadku haszowania przez mnozenie dobrze jeśli m=2p, gdzie p to liczba pierwsza.

Zadanie 1: Testowanie funkcji haszujących (2 pkt)

Zbadaj ile kolizji nastąpi gdy do tablicy T o wielkości m=2*n wstawiamy n liczb naturalnych (duży zakres losowania kluczy np. k = rand() % LONG_MAX;). Test przeprowadź dla n=1000,10000,50000,100000 i w każdym z tych przypadków zrób porównanie dla dwóch funkcji:

  • funkcji haszującej modularnie
  • funkcji haszującej przez mnożenie
Kolizje możesz badać następująco:
  • Zamiast przechowywać i wstawiać do tablicy T dane, będzie to tablica zawierająca tylko 0 lub 1.
  • Gdu w elemencie T[i] stoi 0 to znaczy, że do tego elementu nic nie wstawialiśmy, a jeśli jest to 1 to znaczy, że było wstawiane. Na początku całą Tablicę T trzeba wyzerować.
  • Gdy chcemy wstawić element do T[i], w którym stoi 1 to zwiększamy licznik kolizji o jeden. W przeciwnym wypadku zamieniamy 0 na 1.

*Zadanie dodatkowe dla chętnych (za 0,5 pkt): sprawdzić czy dobór wielkości tablicy T w dwóch przypadkach: m=p, m=2p (p - liczba pierwsza) wpływa na ilość kolizji dla dwóch funkcji haszujących.

Zadanie 2: Haszowanie łacuchowe (3 pkt)

Napisać funkcje realizujące operacje wstawiania, szukania i usuwania w tablicy z haszowaniem łańcuchowym. W tablicy przechowujemy tylko klucze, którymi są liczby całkowite dodatnie.

Zaprezentuj działanie procedur wywołując kilkakrotnie wstawianie, a potem szukanie lub usuwanie. Po każdym uruchomieniu procedury wyświetl tablicę z listami w przejrzystej formie w celu odczytania danych.