Anbefalinger

Hashtabellen er en datastruktur, der gemmer data på en associativ måde. I en hashtabel lagres data i et array-format, hvor hver dataværdi har sin egen unikke indeksværdi. Adgang til data bliver meget hurtig, hvis vi kender indekset for de ønskede data.

Det bliver således en datastruktur, hvor indsættelses- og søgeoperationer er meget hurtige uanset dataenes størrelse. Hash Table bruger et array som lagringsmedie og anvender hash-teknikken til at generere et indeks, hvor et element skal indsættes eller findes fra.

Hashing

Hashing er en teknik til at konvertere en række nøgleværdier til en række indekser i et array. Vi skal bruge modulo-operatoren til at få et område af nøgleværdier. Overvej et eksempel på en hashtabel af størrelse 20, og følgende elementer skal gemmes. Elementerne er i formatet (nøgle,værdi).

Hashfunktion

  • (1,20)
  • (2,70)
  • (42,80)
  • (4,25)
  • (12,44)
  • (14,32)
  • (17,11)
  • (13,78)
  • (37,98)
Sr.nr. Nøgle Hash Array Indeks
1 1 1 % 20 = 1 1
2 2 2 2 % 20 = 2 2
3 42 42 % 20 = 2 2
4 4 4 % 20 = 4 4
5 12 12 % 20 = 12 12
6 14 14 % 20 = 14 14
7 17 17 % 20 = 17 17
8 13 13 % 20 = 13 13
9 37 37 % 20 = 17 17

Linear Sondering

Som vi kan se, kan det ske, at hash-teknikken bruges til at skabe et allerede brugt indeks i arrayet. I et sådant tilfælde kan vi søge efter den næste tomme placering i arrayet ved at kigge ind i den næste celle, indtil vi finder en tom celle. Denne teknik kaldes lineær probing.

Sr.nr. Nøgle Hash Array Indeks Efter lineær probning, Array Index
1 1 1 % 20 = 1 1 1 1
2 2 2 % 20 = 2 2 2
3 42 42 % 20 = 2 2 3
4 4 4 % 20 = 4 4 4
5 12 12 % 20 = 12 12 12
6 14 14 % 20 = 14 14 14
7 17 17 % 20 = 17 17 17
8 13 13 % 20 = 13 13 13 13
9 37 37 % 20 = 17 17 18

Grundlæggende operationer

Følgende er de grundlæggende primære operationer i en hashtabel.

  • Søgning – søger et element i et hashtabellen.

  • Indsætning – indsætter et element i et hashtabellen.

  • sletning – sletter et element fra et hashtabellen.

DataItem

Definer et dataelement med nogle data og en nøgle, på grundlag af hvilke der skal søges i en hashtabel.

struct DataItem { int data; int key;};

Hashmetode

Definér en hashmetode til beregning af hashkoden for dataelementets nøgle.

int hashCode(int key){ return key % SIZE;}

Søgningsoperation

Når der skal søges efter et element, beregnes hashkoden for den overgivne nøgle, og elementet lokaliseres ved hjælp af denne hashkode som indeks i arrayet. Brug lineær probing til at få elementet frem, hvis elementet ikke findes ved den beregnede hashkode.

Eksempel

struct DataItem *search(int key) { //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray != NULL) { if(hashArray->key == key) return hashArray; //go to next cell ++hashIndex; //wrap around the table hashIndex %= SIZE; } return NULL; }

Insert Operation

Når et element skal indsættes, beregnes hashkoden for den overgivne nøgle, og indekset lokaliseres ved hjælp af denne hashkode som indeks i arrayet. Brug lineær probing for tom placering, hvis der findes et element ved den beregnede hashkode.

Eksempel

void insert(int key,int data) { struct DataItem *item = (struct DataItem*) malloc(sizeof(struct DataItem)); item->data = data; item->key = key; //get the hash int hashIndex = hashCode(key); //move in array until an empty or deleted cell while(hashArray != NULL && hashArray->key != -1) { //go to next cell ++hashIndex; //wrap around the table hashIndex %= SIZE; } hashArray = item; }

Slet operation

Når et element skal slettes, beregnes hashkoden for den overgivne nøgle, og indekset lokaliseres ved hjælp af denne hashkode som indeks i arrayet. Brug lineær probing til at få elementet frem, hvis der ikke findes et element ved den beregnede hashkode. Når det er fundet, lagres et dummy-element der for at holde hashtabellens ydeevne intakt.

Eksempel

struct DataItem* delete(struct DataItem* item) { int key = item->key; //get the hash int hashIndex = hashCode(key); //move in array until an empty while(hashArray !=NULL) { if(hashArray->key == key) { struct DataItem* temp = hashArray; //assign a dummy item at deleted position hashArray = dummyItem; return temp; } //go to next cell ++hashIndex; //wrap around the table hashIndex %= SIZE; } return NULL; }

For at vide mere om hash-implementering i programmeringssproget C skal du klikke her.

Anbefalinger