Implementación de una tabla hash propia con sondeo lineal de direccionamiento abierto

Requisito previo: introducción al hash , implementación de nuestra propia tabla hash con enstringmiento separado en Java
En el direccionamiento abierto, todos los elementos se almacenan en la propia tabla hash. Entonces, en cualquier momento, el tamaño de la tabla debe ser mayor o igual que el número total de claves (tenga en cuenta que podemos aumentar el tamaño de la tabla copiando datos antiguos si es necesario).
 

  • Insertar (k): siga sondeando hasta encontrar una ranura vacía. Una vez que encuentre una ranura vacía, inserte k.
  • Buscar (k): siga sondeando hasta que la clave de la ranura no sea igual a k o se alcance una ranura vacía.
  • Eliminar (k): la operación de eliminación es interesante. Si simplemente eliminamos una clave, la búsqueda puede fallar. Por lo tanto, las ranuras de claves eliminadas se marcan especialmente como «eliminadas».

Aquí, para marcar un Node eliminado, hemos utilizado un Node ficticio con clave y valor -1. 
Insertar puede insertar un elemento en un espacio eliminado, pero la búsqueda no se detiene en un espacio eliminado.
Todo el proceso asegura que para cualquier clave obtengamos una posición entera dentro del tamaño de la Tabla Hash para insertar el valor correspondiente. 
Entonces, el proceso es simple, el usuario proporciona un conjunto de pares (clave, valor) como entrada y, en función del valor generado por la función hash, se genera un índice donde se almacena el valor correspondiente a la clave en particular. Entonces, siempre que necesitemos obtener un valor correspondiente a una clave que es solo O (1).
 

Código –
 

CPP

#include <bits/stdc++.h>
using namespace std;
  
// template for generic type
template <typename K, typename V>
  
// Hashnode class
class HashNode {
public:
    V value;
    K key;
  
    // Constructor of hashnode
    HashNode(K key, V value)
    {
        this->value = value;
        this->key = key;
    }
};
  
// template for generic type
template <typename K, typename V>
  
// Our own Hashmap class
class HashMap {
    // hash element array
    HashNode<K, V>** arr;
    int capacity;
    // current size
    int size;
    // dummy node
    HashNode<K, V>* dummy;
  
public:
    HashMap()
    {
        // Initial capacity of hash array
        capacity = 20;
        size = 0;
        arr = new HashNode<K, V>*[capacity];
  
        // Initialise all elements of array as NULL
        for (int i = 0; i < capacity; i++)
            arr[i] = NULL;
  
        // dummy node with value and key -1
        dummy = new HashNode<K, V>(-1, -1);
    }
    // This implements hash function to find index
    // for a key
    int hashCode(K key)
    {
        return key % capacity;
    }
  
    // Function to add key value pair
    void insertNode(K key, V value)
    {
        HashNode<K, V>* temp = new HashNode<K, V>(key, value);
  
        // Apply hash function to find index for given key
        int hashIndex = hashCode(key);
  
        // find next free space
        while (arr[hashIndex] != NULL
               && arr[hashIndex]->key != key
               && arr[hashIndex]->key != -1) {
            hashIndex++;
            hashIndex %= capacity;
        }
  
        // if new node to be inserted
        // increase the current size
        if (arr[hashIndex] == NULL
            || arr[hashIndex]->key == -1)
            size++;
        arr[hashIndex] = temp;
    }
  
    // Function to delete a key value pair
    V deleteNode(int key)
    {
        // Apply hash function
        // to find index for given key
        int hashIndex = hashCode(key);
  
        // finding the node with given key
        while (arr[hashIndex] != NULL) {
            // if node found
            if (arr[hashIndex]->key == key) {
                HashNode<K, V>* temp = arr[hashIndex];
  
                // Insert dummy node here for further use
                arr[hashIndex] = dummy;
  
                // Reduce size
                size--;
                return temp->value;
            }
            hashIndex++;
            hashIndex %= capacity;
        }
  
        // If not found return null
        return NULL;
    }
  
    // Function to search the value for a given key
    V get(int key)
    {
        // Apply hash function to find index for given key
        int hashIndex = hashCode(key);
        int counter = 0;
  
        // finding the node with given key
        while (arr[hashIndex] != NULL) { // int counter =0; // BUG!
  
            if (counter++ > capacity) // to avoid infinite loop
                return NULL;
  
            // if node found return its value
            if (arr[hashIndex]->key == key)
                return arr[hashIndex]->value;
            hashIndex++;
            hashIndex %= capacity;
        }
  
        // If not found return null
        return NULL;
    }
  
    // Return current size
    int sizeofMap()
    {
        return size;
    }
  
    // Return true if size is 0
    bool isEmpty()
    {
        return size == 0;
    }
  
    // Function to display the stored key value pairs
    void display()
    {
        for (int i = 0; i < capacity; i++) {
            if (arr[i] != NULL && arr[i]->key != -1)
                cout << "key = " << arr[i]->key
                     << "  value = "
                     << arr[i]->value << endl;
        }
    }
};
  
// Driver method to test map class
int main()
{
    HashMap<int, int>* h = new HashMap<int, int>;
    h->insertNode(1, 1);
    h->insertNode(2, 2);
    h->insertNode(2, 3);
    h->display();
    cout << h->sizeofMap() << endl;
    cout << h->deleteNode(2) << endl;
    cout << h->sizeofMap() << endl;
    cout << h->isEmpty() << endl;
    cout << h->get(2);
  
    return 0;
}

Producción – 
 

key = 1 value = 1
key = 2 value = 3
2
3
1
0
0

Este artículo es una contribución de Chhavi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *