Hash search + método de detección secundaria 1078 Hashing (25 puntos)

1078 Hashing (25 分)

La tarea de este problema es simple: insertar una secuencia de enteros positivos distintos en una tabla hash y generar las posiciones de los números de entrada. La función hash se define como H (clave) = clave% TSize donde TSize es el tamaño máximo de la tabla hash. El sondeo cuadrático (solo con incrementos positivos) se utiliza para resolver las colisiones.

Tenga en cuenta que el tamaño de la tabla es mejor para ser primo. Si el tamaño máximo dado por el usuario no es primo, debe redefinir el tamaño de la tabla para que sea el número primo más pequeño que sea mayor que el tamaño dado por el usuario.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene dos números positivos: MSize (≤10
4
) y N (≤MSize), que son el tamaño de tabla definido por el usuario y el número de números de entrada, respectivamente. Luego se dan N enteros positivos distintos en la siguiente línea. Todos los números en una línea están separados por un espacio.

Especificación de salida:
para cada caso de prueba, imprima las posiciones correspondientes (el índice comienza desde 0) de los números de entrada en una línea. Todos los números en una línea están separados por un espacio, y no debe haber espacio adicional al final de la línea. En caso de que sea imposible insertar el número, imprima "-" en su lugar.

Entrada de muestra:

4 4
10 6 4 15

Salida de muestra:

0 1 4 -

Resolución de problemas
Dado un tamaño de tabla hash M (convertido a un número primo no menor que M);
dado un número N;
genera los subíndices después de almacenar cada número en orden;

Preste atención al
método de detección secundaria, cada vez que intente + t al cuadrado, la condición límite es t <M / 2, si no ha encontrado una ubicación para almacenar en este momento, significa que no puede almacenarse

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;


bool isPrim(int n)
{
	if(n<2) return false;
	if(n==2) return true;
	for(int i=2;i<=sqrt(n);i++)
		if(n%i==0) return false;
	return true;
}


int nextPrim(int n)
{//素数
//不能被2——根号n的所有数整除的数 
	while(!isPrim(n))
		++n;
		
	return n;	
}

const int maxN=10010;
int M,N;
int Hash[maxN];
void input()
{
	cin>>M>>N;
	M=nextPrim(M);		
	fill(Hash,Hash+M,-1);    //全部置为-1
	
	int tmp;
	for(int i=0;i<N;i++)
	{
		cin>>tmp;
		int t=0;
		int index= tmp%M;
		int flag=0;
		
		while(t<M)
		{
		t++;
		if(Hash[index]==-1){
		Hash[index]=tmp;
		cout<<index;
		flag=1;
		break;
		}
		else
			index=(tmp%M+t*t)%M;		
		}
		if(flag==0)
			cout<<"-";
		if(i!=N-1)
			cout<<" ";
	}
}


int main()
{
	input();
}
Publicados 105 artículos originales · ganado elogios 6 · vistas 4937

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105632113
Recomendado
Clasificación