Adresowanie otwarte.

Adresowania otwarte to inny sposób realizacji "tablicy z haszowaniem".

W adresowaniu otwartym używamy jednej dużej tablicy wskazań do elementów (klucz, wartość).

Niech "U" będzie zbiorem kluczy. Używamy następującej dwuargumentowej funkcji haszującej "h": przy czym ciąg: musi być permutacją ciągu <0,1, ... ,m-1>.

Ciąg <h(k,0), h(k,1), ... , h(k,m-1)> nazywamy ciągiem kontrolnym klucza "k".

Operacje wstawiania i wyszukiwania implementujemy następująco:

(Zauważmy że w wypadku adresowania otwartego tablica T musi być większa niż liczba wstawianych elementów).

Niech "h2" będzie zwykłą funkcją haszującą, przyjmującą wartości ze zbioru {0, ..., m-1}.
Można przy jej pomocy skonstruować funkcję "h" na następujące sposoby:

  1. adresowanie liniowe;

  2. h(k,i) = (h2(k) + i) mod m
  3. adresowanie kwadratowe;

  4. h(k,i) = (h2(k) + c1*i + c2*i^2) mod m
  5. adresowanie podwójne;

  6. h(k,i) = (h2(k) + i*h3(k)) mod m
    gdzie "h3" jest także zwykłą funkcją haszującą
    UWAGA:
    musimy zapewnić że "h3(k)" i "m" są względnie pierwsze, np
    h2(k)=k mod m; h3(k)=1 + k mod (m-1); gdzie "m" jest liczbą pierwszą
Zadanie 33

Zaimplementuj tablicę z haszowaniem przy pomocy adresowania otwartego, oraz oblicz:
  1. maksymalny czas wyszukiwania elementu o zadanym kluczu
  2. średni czas wyszukiwania elementu o zadanym kluczu
dla wszystkich 3 rodzajów funkcji "h(k,i)":
  1. adresowanie liniowe
  2. adresowanie kwadratowe
  3. adresowanie podwójne
Przez "czas" rozumiem liczbę operacji porównywania kluczy. Należy obliczyć ten czas dla każdego klucza i na tej podstawie wyznaczyć wartość maksymalną i średnią.
Można użyć (zwykłych) funkcji haszujących z poprzedniej lekcji.  Można także użyć prymitywnej funkcji "suma kodów liter" mod m.
Do testów użyj kluczy z plików "const.txt" i "modem.txt" oraz losowych napisów.