Un artículo para ayudarte a entender qué es un hash

¿Qué es un hash?

Primero veamos un problema de este tipo: dados N enteros positivos y luego M enteros positivos, pregúntele si cada número que aparece en M ha aparecido en N. Donde N, M<=10³.

La idea más intuitiva es enumerar violentamente. Primero, elija un número en M y luego compárelo uno por uno con el número en N. Después de la comparación, elija el segundo número en M, y así sucesivamente. Pero esta complejidad alcanza a O(MN), que no es un algoritmo excelente.

Si desea usar el espacio para el tiempo, deje M enteros como el subíndice de la matriz para crear una matriz. Por ejemplo, los números M son 5, 9, 12, 7 y los números N son 9, 7, 12 y 6, respectivamente. Luego, primero cree una tabla hash de matriz bool [Maxn] = {falso}, luego recorra los valores correspondientes de los subíndices 9, 7, 12, 6 de falso a verdadero, y luego recorra 5, 9, 12, 7, pero mientras atravesando, agregue una oración si hashtable[x] es verdadero para determinar si ha ocurrido.

bool hashtable[10000]={false};
int mian(){
	int n,m,x;
	scanf{"%d%d",&n,&m};
	for(int i=0;i<n;i++){
		scanf("%d",&x);
		hashtable[x]=true;  //数字x出现过
	}
	for(int i=0;i<m;i++){
		scanf("%d",&x);
		if(hashtable[x]==true)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}

Si pregunta la cantidad de veces que cada uno de los números M que se van a consultar aparece en los números N, puede convertir la matriz de tabla hash a tipo int, y cada vez que aparece, ++. (Inténtalo tú mismo)

Todos los temas anteriores se usan directamente como el subíndice de la matriz para las estadísticas (¡muy práctico!) ¿Qué pasa si queremos contar el número de ocurrencias de la cadena de amor en un artículo en inglés? Entonces usamos amor como el subíndice de las estadísticas. Pero, en general, solo se pueden subíndices los números enteros, ¿qué debo hacer? Así que tenemos que usar la idea de hashing.

El significado oficial de hashing es "convertir un elemento en un número entero a través de una función para que el número entero pueda representar el elemento de la manera más única posible".

El punto popular es convertir el elemento en un entero que pueda representarlo de manera única. Ver este entero en el futuro es equivalente a ver el elemento. Luego uso este entero como un subíndice para usar este carácter como un subíndice. Según esto idea, no es que todo puede ser un subíndice.

Los métodos comúnmente usados ​​son: método de división y resto, método de exploración lineal, método de exploración cuadrada, método de direcciones en cadena, etc. Estos métodos no se discutirán en detalle aquí, porque este paso se puede omitir en el próximo capítulo.

Hay una biblioteca de mapas en C++, que permite subíndices de caracteres directamente, la computadora ya nos ha hecho un hash de estos caracteres (es decir, hashing, porque el inglés de hashing es hash), y veremos el título a continuación. .

Tema: Si comprar
o no Descripción del problema: Xiaohong quiere comprar algunas cuentas para hacer un collar de cuentas que le guste. El vendedor de cuentas tenía muchos hilos de cuentas de colores, pero no vendía ninguno de los hilos aparte. Entonces, Xiaohong le pide que lo ayude a determinar si una determinada cadena de cuentas contiene todas las cuentas que desea. Si es así, dígale cuántas cuentas extra tiene, y si no, dígale cuántas cuentas le faltan.
Análisis: Aquí , los caracteres en el rango de 0 9, a z, A~Z se utilizan para representar el color.
Formato de entrada: para cada caso de prueba, entregue las cuentas del propietario del puesto y las cuentas que Xiaohong quiere comprar y hacer en dos líneas respectivamente, y las dos cadenas no deben exceder las 1000 cuentas.
Formato de salida: si puede comprar, indique SÍ y cuántas cuentas adicionales hay; si no, indique NO y cuántas cuentas faltan en una línea. Los puntos están separados por un espacio.
Caso de uso de entrada:
ppRYYGrrYBR2258
YrR8RrY
Muestra de salida:
SÍ 8

Análisis de ideas : coloque las cuentas del jefe en la tabla hash, use el color de las cuentas como clave, la cantidad de cuentas como valor para formar un par clave-valor y luego use el color de las cuentas que Xiaohong necesita como la clave para acceder a la tabla hash de cuentas del jefe, si la hay, se reducirá en uno el valor correspondiente a la tabla hash de cuentas del jefe, si no, se sumará en uno la cuenta faltante, finalmente, si la cuenta faltante es mayor que 0, significa que no se puede comprar, y se emitirá la cuenta que falta.Si la cuenta que falta es igual a 0 (es decir, no hay escasez de cuentas), entonces en este momento, la cantidad de perlas del jefe menos el número de perlas de Xiaohong es el número de perlas en exceso.

#include<iostream>
#include<map>
using namespace std;

int main() {
	int lack=0,surplus=0;
	string boss;
	string hong;
	cin >> boss;
	cin >> hong;
	map<char, int> pearl;//哈希表没有键值对的地方就是0-0
	for (int i = 0; i < boss.length(); i++) {
		pearl[boss[i]]++;
	}
	for (int i = 0; i < hong.length(); i++) {
		if (pearl[hong[i]] == 0)
			lack++;
		else
			pearl[hong[i]]--;//相当于把珠子给了小红,然后摊主的珠子减一,防止后面小红要好多颗珍珠,摊主就只有一颗珍珠在这里唬人
	}
	surplus = boss.length() - hong.length();
	if (lack > 0)
		cout << "NO!!" << "  " << lack << endl;
	else
		cout << "YES!!" << "  "<< surplus  <<endl;
	return 0;
}

Creo que después de ver esto has entendido que es el hashing y como usarlo, debes practicar más.

Supongo que te gusta

Origin blog.csdn.net/Dai_sir_man/article/details/120182871
Recomendado
Clasificación