F - Encontrar la estructura de datos experimental de cinco: el cuadrado de la tabla hash

Descripción

Dada entero positivo no duplicado de los datos, el establecimiento de acuerdo con una función hash dada que corresponde a la tabla hash, la función hash es H (Key) = Key% P , P es una longitud tabla hash, P es un número primo, el método de manejar conflictos método de detección cuadrado usando incrementales ± I ^ 2 = DI, i = l, 2,3, ..., m. 1-
la entrada

Que comprende una pluralidad de conjuntos de entrada de datos de prueba, al final del EOF.

Cada fila de los dos primeros datos se dan positivo número entero N (N <= 500) y P (P> = 2 N es el número mínimo primo), N es el número de elementos a insertar en la tabla hash, P es la tabla hash longitud de la mesa; línea 2 sin elementos dados número entero positivo N, el intervalo entre el espacio de datos de repetición.
salida

La salida de cada número almacenado en la ubicación tabla hash de datos secuencialmente de entrada (el subíndice de la tabla de hash empieza en 0), un espacio entre el intervalo de datos, la plaza conflicto método de detección.
muestra

Entrada

4 11
10 6 4 15
9 11
47 7 29 11 9 84 54 20 30
Salida

6 5 4 10
3 7 8 0 9 6 10 2 1

#include <stdio.h>
#include <string.h>
int main()
{
    int n,p,i,d,id;
    int Hash[550],v[550];
    while(scanf("%d %d",&n,&p)!=EOF)
    {
        int len=0;
        memset(Hash,-1,sizeof(Hash));//将数组均置为-1;
        for(i=0; i<n; i++)
        {
            scanf("%d",&d);
            id=d%p;
            if(Hash[id]==-1)//当哈希表该位置为空时直接插入
                Hash[id]=d;
            else//不为空则冲突
            {
                int f=1,j=1,mid=id;
                while(Hash[mid]!=-1) //若不等于-1,则冲突;
                {
                    mid=(id+f*j*j)%p;//平方探测法;
                    f=f*(-1);
                    if(f==1)//如果一个平方区间没有找到则再找下一个平方区间
                        j++;
                }
               id = mid;
               Hash[id] = d;
            }
            v[len++]=id;//用数组来存储位置信息;
        }
        for(i=0; i<len; i++)
        {
            if(i==0)
                printf("%d",v[i]);
            else
                printf(" %d",v[i]);
        }
        printf("\n");
    }
    return 0;
}


Publicados 176 artículos originales · ganado elogios 7 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/Fusheng_Yizhao/article/details/104923550
Recomendado
Clasificación