logo

Estructura de datos de la tabla hash

¿Qué es la tabla hash?

Una tabla Hash se define como una estructura de datos que se utiliza para insertar, buscar y eliminar pares clave-valor rápidamente. Opera sobre el concepto de hash , donde cada clave se traduce mediante una función hash en un índice distinto en una matriz. El índice funciona como una ubicación de almacenamiento para el valor coincidente. En palabras simples, asigna las claves con el valor.

¿Qué es el factor de carga?

El factor de carga de una tabla hash está determinado por la cantidad de elementos que se mantienen allí en relación con el tamaño de la tabla. La tabla puede estar abarrotada y tener tiempos de búsqueda y colisiones más prolongados si el factor de carga es alto. Se puede mantener un factor de carga ideal con el uso de una buena función hash y un cambio de tamaño de tabla adecuado.



arquitectura java

¿Qué es una función Hash?

Una función que traduce claves en índices de matriz se conoce como función hash. Las claves deben distribuirse uniformemente en toda la matriz mediante una función hash decente para reducir las colisiones y garantizar velocidades de búsqueda rápidas.

  • Suposición de universo entero: Se supone que las claves son números enteros dentro de un cierto rango según el supuesto del universo entero. Esto permite el uso de operaciones hash básicas como división o multiplicación.
  • Hashing por división: Esta sencilla técnica de hash utiliza el valor restante de la clave después de dividirla por el tamaño de la matriz como índice. Cuando el tamaño de una matriz es un número primo y las claves están espaciadas uniformemente, funciona bien.
  • Hash por multiplicación: Esta sencilla operación de hash multiplica la clave por una constante entre 0 y 1 antes de tomar la parte fraccionaria del resultado. Después de eso, el índice se determina multiplicando el componente fraccionario por el tamaño de la matriz. Además, funciona eficazmente cuando las teclas están distribuidas por igual.

Elegir una función hash :

La selección de una función hash decente se basa en las propiedades de las claves y la funcionalidad prevista de la tabla hash. Usar una función que distribuya uniformemente las teclas y reduzca las colisiones es crucial.

Criterios según los cuales se elige una función hash:



  • Para garantizar que el número de colisiones se mantenga al mínimo, una buena función hash debe distribuir las claves en toda la tabla hash de manera uniforme. Esto implica que para todos los pares de claves, la probabilidad de que dos claves lleguen a la misma posición en la tabla debe ser bastante constante.
  • Para permitir un hash y una recuperación de claves rápidos, la función hash debe ser computacionalmente eficiente.
  • Debería resultar complicado deducir la clave a partir de su valor hash. Como resultado, es menos probable que los intentos de adivinar la clave utilizando el valor hash tengan éxito.
  • Una función hash debe ser lo suficientemente flexible como para ajustarse a medida que cambian los datos que se están procesando. Por ejemplo, la función hash debe seguir funcionando correctamente si las claves que se están procesando cambian de tamaño o formato.

Técnicas de resolución de colisiones :

Las colisiones ocurren cuando dos o más claves apuntan al mismo índice de matriz. El encadenamiento, el direccionamiento abierto y el doble hash son algunas técnicas para resolver colisiones.

  • direccionamiento abierto : Las colisiones se manejan buscando el siguiente espacio vacío en la tabla. Si la primera ranura ya está ocupada, la función hash se aplica a las ranuras siguientes hasta que quede una vacía. Hay varias formas de utilizar este enfoque, incluido el doble hash, el sondeo lineal y el sondeo cuadrático.
  • Encadenamiento separado : En el encadenamiento separado, está presente una lista vinculada de objetos que codifican cada ranura en la tabla hash. Se incluyen dos claves en la lista vinculada si se asignan a la misma ranura. Este método es bastante sencillo de utilizar y puede gestionar varias colisiones.
  • Hash de Robin Hood: Para reducir la longitud de la cadena, las colisiones en el hashing de Robin Hood se solucionan desactivando las claves. El algoritmo compara la distancia entre la ranura y la ranura ocupada de las dos claves si una nueva clave se convierte en una ranura ya ocupada. La clave existente se cambia por la nueva si está más cerca de su ranura ideal. Esto acerca la llave existente a su ranura ideal. Este método tiende a reducir las colisiones y la longitud promedio de la cadena.

Cambio de tamaño dinámico:

Esta característica permite que la tabla hash se expanda o contraiga en respuesta a cambios en la cantidad de elementos contenidos en la tabla. Esto promueve un factor de carga ideal y tiempos de búsqueda rápidos.

'algoritmo de Kruskal'

Implementaciones de la tabla hash

Python, Java, C++ y Ruby son sólo algunos de los lenguajes de programación que admiten tablas hash. Se pueden utilizar como una estructura de datos personalizada además de incluirse con frecuencia en la biblioteca estándar.



Ejemplo: contar caracteres en la cadena geeksforgeeks.

En este ejemplo, utilizamos una técnica de hash para almacenar el recuento de la cadena.

C++
#include  using namespace std; int main() {  //initialize a string  string s='geeksforgeeks';    // Using an array to store the count of each alphabet   // by mapping the character to an index value  int arr[26]={0};    //Storing the count  for(int i=0;i
Java
public class CharacterCount {  public static void main(String[] args) {  // Initialize a string  String s = 'geeksforgeeks';  // Using an array to store the count of each alphabet  // by mapping the character to an index value  int[] arr = new int[26];  // Storing the count  for (int i = 0; i < s.length(); i++) {  arr[s.charAt(i) - 'a']++;  }  // Search the count of the character  char ch = 'e';  // Get count  System.out.println('The count of ' + ch + ' is ' + arr[ch - 'a']);  } }>
Pitón
# Initialize a string s = 'geeksforgeeks' # Using a list to store the count of each alphabet # by mapping the character to an index value arr = [0] * 26 # Storing the count for i in range(len(s)): arr[ord(s[i]) - ord('a')] += 1 # Search the count of the character ch = 'e' # Get count print('The count of ', ch, ' is ', arr[ord(ch) - ord('a')])>
C#
using System; class Program {  static void Main(string[] args) {  //initialize a string  string s = 'geeksforgeeks';  // Using an array to store the count of each alphabet   // by mapping the character to an index value  int[] arr = new int[26];  //Storing the count  for (int i = 0; i < s.Length; i++) {  arr[s[i] - 'a']++;  }  //Search the count of the character  char ch = 'e';  // get count  Console.WriteLine('The count of ' + ch + ' is ' + arr[ch - 'a']);  } }>
JavaScript
// Initialize a string const s = 'geeksforgeeks'; // Using an array to store the count of each alphabet // by mapping the character to an index value const arr = Array(26).fill(0); // Storing the count for (let i = 0; i < s.length; i++) {  arr[s.charCodeAt(i) - 'a'.charCodeAt(0)]++; } // Search the count of the character const ch = 'e'; // Get count console.log(`The count of ${ch} is ${arr[ch.charCodeAt(0) - 'a'.charCodeAt(0)]}`);>


dormir en js

Producción:

The count of e is 4>

Análisis de complejidad de una tabla hash:

Para las operaciones de búsqueda, inserción y eliminación, las tablas hash tienen una complejidad temporal promedio de O(1). Sin embargo, estas operaciones pueden, en el peor de los casos, requerir un tiempo O(n), donde n es el número de elementos de la tabla.

Aplicaciones de la tabla hash:

  • Las tablas hash se utilizan con frecuencia para indexar y buscar volúmenes masivos de datos. Un motor de búsqueda puede utilizar una tabla hash para almacenar las páginas web que ha indexado.
  • Los datos generalmente se almacenan en la memoria caché a través de tablas hash, lo que permite un acceso rápido a la información de uso frecuente.
  • Las funciones hash se utilizan con frecuencia en criptografía para crear firmas digitales, validar datos y garantizar la integridad de los datos.
  • Las tablas hash se pueden utilizar para implementar índices de bases de datos, lo que permite un acceso rápido a los datos basados ​​en valores clave.