F는 - 다섯 가지의 실험 데이터 구조를 찾기 : 해시 테이블의 제곱을

기술

사업소, 해시 함수 H (키)는 해쉬 테이블에 대응하는 소정의 해시 함수에 따라, 데이터의 중복 없음 세트 정수 포지티브 주어진 키 %의 P는 = , P는 , P가 소수이며, 해쉬 테이블 길이 , ..., I = 2 DI 난 -1,2,3- = ^ ± 증분을 사용하여 충돌을 m을 제곱 검출 방법을 처리하는 방법. -1-
입력

테스트 데이터 입력의 복수의 세트를 포함하는 상기 EOF 끝.

처음 두 데이터의 각 행은 N (N <= 500) 및 P (P> = 2N가 최소의 소수 인) 정수 포지티브 주어, N은 해시 테이블에 삽입되는 소자의 개수이고, P는 해시 테이블은 나타난 길이 양의 정수 N은 데이터 공간의 간격을 소정의 반복 요소없이 라인 (2).
산출

순차적으로 입력 데이터 (0 첨자 해시 테이블 시작) 해시 테이블의 위치에 저장된 각각의 수의 출력 데이터 구간 사이의 공간은 사각형 검출 방법 충돌.
견본

입력

(4) 11
10 6 4 15
9 11
47 7 29 11 9 84 54 20 30
출력

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

#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;
}


게시 된 176 개 원래 기사 · 원 찬양 7 ·은 30000 +를 볼

추천

출처blog.csdn.net/Fusheng_Yizhao/article/details/104923550