Datenstruktur und Algorithmen - Hash-Tabelle

Hash Table ist eine Datenstruktur, in der Daten auf assoziative Weise gespeichert werden. In einer Hash-Tabelle werden Daten in einem Array-Format gespeichert, wobei jeder Datenwert seinen eigenen eindeutigen Indexwert hat. Der Zugriff auf Daten wird sehr schnell, wenn wir den Index der gewünschten Daten kennen.

Somit wird es zu einer Datenstruktur, in der Einfüge- und Suchvorgänge unabhängig von der Größe der Daten sehr schnell sind. Hash Table verwendet ein Array als Speichermedium und generiert mithilfe der Hash-Technik einen Index, in den ein Element eingefügt werden soll oder von dem aus es gefunden werden soll.

Hashing

Hashing ist eine Technik zum Konvertieren eines Bereichs von Schlüsselwerten in einen Bereich von Indizes eines Arrays. Wir werden den Modulo-Operator verwenden, um eine Reihe von Schlüsselwerten zu erhalten. Betrachten Sie ein Beispiel für eine Hash-Tabelle der Größe 20, und die folgenden Elemente müssen gespeichert werden. Artikel sind im Format (Schlüssel, Wert).

  • (1,20)
  • (2,70)
  • (42,80)
  • (4,25)
  • (12,44)
  • (14,32)
  • (17,11)
  • (13,78)
  • (37,98)
Sr.Nr. Schlüssel Hash Array-Index
1 1 1% 20 = 1 1
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

Lineare Abtastung

Wie wir sehen können, kann es vorkommen, dass die Hashing-Technik verwendet wird, um einen bereits verwendeten Index des Arrays zu erstellen. In einem solchen Fall können wir die nächste leere Stelle im Array durchsuchen, indem wir in die nächste Zelle schauen, bis wir eine leere Zelle finden. Diese Technik wird als lineare Abtastung bezeichnet.

Sr.Nr. Schlüssel Hash Array-Index Nach der linearen Prüfung Array-Index
1 1 1% 20 = 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
9 37 37% 20 = 17 17 18

Grundoperationen

Im Folgenden sind die grundlegenden primären Operationen einer Hash-Tabelle aufgeführt.

  • Search - Sucht ein Element in einer Hash-Tabelle.

  • Insert - fügt ein Element in eine Hash-Tabelle ein.

  • delete - Löscht ein Element aus einer Hash-Tabelle.

DataItem

Definieren Sie ein Datenelement mit einigen Daten und Schlüsseln, anhand dessen die Suche in einer Hash-Tabelle durchgeführt werden soll.

struct DataItem {
   int data;
   int key;
};

Hash-Methode

Definieren Sie eine Hashing-Methode, um den Hash-Code des Schlüssels des Datenelements zu berechnen.

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

Suchvorgang

Wenn ein Element durchsucht werden soll, berechnen Sie den Hash-Code des übergebenen Schlüssels und suchen Sie das Element anhand dieses Hash-Codes als Index im Array. Verwenden Sie die lineare Prüfung, um das Element voranzubringen, wenn das Element im berechneten Hash-Code nicht gefunden wird.

Beispiel

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

   return NULL;        
}

Operation einfügen

Wenn ein Element eingefügt werden soll, berechnen Sie den Hash-Code des übergebenen Schlüssels und suchen Sie den Index unter Verwendung dieses Hash-Codes als Index im Array. Verwenden Sie die lineare Prüfung für die leere Position, wenn im berechneten Hashcode ein Element gefunden wird.

Beispiel

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[hashIndex] != NULL && hashArray[hashIndex]->key != -1) {
      //go to next cell
      ++hashIndex;
		
      //wrap around the table
      hashIndex %= SIZE;
   }
	
   hashArray[hashIndex] = item;        
}

Vorgang löschen

Wenn ein Element gelöscht werden soll, berechnen Sie den Hash-Code des übergebenen Schlüssels und suchen Sie den Index unter Verwendung dieses Hash-Codes als Index im Array. Verwenden Sie die lineare Prüfung, um das Element voranzubringen, wenn im berechneten Hash-Code kein Element gefunden wird. Wenn gefunden, speichern Sie dort ein Dummy-Element, um die Leistung der Hash-Tabelle aufrechtzuerhalten.

Beispiel

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[hashIndex] !=NULL) {
	
      if(hashArray[hashIndex]->key == key) {
         struct DataItem* temp = hashArray[hashIndex]; 
			
         //assign a dummy item at deleted position
         hashArray[hashIndex] = dummyItem; 
         return temp;
      } 
		
      //go to next cell
      ++hashIndex;
		
      //wrap around the table
      hashIndex %= SIZE;
   }  
	
   return NULL;        
}

Um mehr über die Hash-Implementierung in der Programmiersprache C zu erfahren, klicken Sie bitte hier .