zoukankan      html  css  js  c++  java
  • 7-43 字符串关键字的散列映射 (25分)

    注意:第i次冲突后第i次探测的散列地址 Hi=(H(key)+di)%p

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <malloc.h>
    typedef struct {
        int key;
        char value[9];
    } Hash;
    int hash(char value[]) {//求H(key)
        int len=strlen(value);
        int sum=0;
        if(len==1)
            sum=value[len-1]-'A';
        else if(len==2)
            sum=(value[len-2]-'A')*32+(value[len-1]-'A');
        else if(len>=3)
            sum=(value[len-3]-'A')*32*32+(value[len-2]-'A')*32+(value[len-1]-'A');
        return sum;
    }
    int main() {
        int n,p;
        scanf("%d %d",&n,&p);
        int i,j,k=0;
        int flag[p],index[n];
        Hash H[n];
        memset(flag,0,sizeof(flag));
        memset(index,0,sizeof(index));
        char c[9];
        for(i=0; i<n; i++) {
            scanf("%s",c);
            for(j=0; j<k; j++) {
                if(!strcmp(c,H[j].value)) {
                    index[i]=H[j].key;
                    break;
                }
            }
            if(j==k) {
                int key=hash(c);
                int tag=1,d=1,D=1,tmp=key;
                while(flag[key%p]) {
                    key=tmp+tag*D;//注意key不是迭代
                    if(key<0)
                        key=tmp;//回退
                    if(tag==-1) {
                        d++;
                        D=d*d;
                    }
                    tag=-1*tag;
                }
                flag[key%p]=1;
                index[i]=key%p;
                strcpy(H[k].value,c);
                H[k].key=key%p;
                k++;
            }
        }
        for(i=0; i<n; i++) {
            if(i>0)
                printf(" ");
            printf("%d",index[i]);
        }
        return 0;
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    古人诗词之王安石
    关于周期函数的命题
    Strum—Lioville问题
    计算反常积分
    【面积原理】计算级数和
    【洛谷P6046】纯粹容器
    【洛谷P3631】方格染色
    【牛客挑战赛48 E】速度即转发
    【CF103D】Time to Raid Cowavans
    【洛谷P4280】逆序对
  • 原文地址:https://www.cnblogs.com/snzhong/p/12430384.html
Copyright © 2011-2022 走看看