1023. 简单哈希2 哈希冲突的平方探测法

来源:互联网 发布:变声软件手机版 编辑:程序博客网 时间:2024/05/22 07:05
Description

 哈希表也称为散列表,它是通过关键码值而进行直接访问的数据结构。即它通过把一个关键码映射到表中的一个位置来访问记录,以加快查找速度。当然了在做关键码映射的时候,难免会把不同的关键码映射到相同的位置,这时冲突就产生了。使用平方探测法(Quadratic Probing)可以解决哈希中的冲突问题它的基本思想是:设hash函数为h(key) = d,并且假定其存储结构为循环数组,则当冲突发生时,它接下来需要探测的位置为h+1, h+4, h+9, ……, h+i^2,……直到冲突得到解决。

例如现有关键码集为 {477291116922283}
设:哈希表表长为m=11;哈希函数为Hash(key)=key mod 11;采用平方探测法处理冲突。建哈希表如下:
 
0123456789101122 47921637298 
 
现在给定哈希函数为Hash(key)= key mod m,要求按照上述规则使用平方探测法处理冲突的方法建立相应哈希表,并且处理以下操作。
Add a——表示a(|a| <= 1000000000)加入到hash表中。
Query a——表示查询a是否在hash表中
Pint——表示打印出当前的hash表状态
End——结束操作
Input

 输入的第一行为一个整数m1<m<=1000),表示hash表所用的数组的大小,同时也表示hash函数需要模的值,见题意描述。

接下来会有若干行,表示操作(如题所述),当输入为End时结束程序。
Output
对于每一个Query a操作,如果ahash表里面,输出yes,否则输出no,对于每一个Print函数,打印当前的hash表状态,格式为idx#key,其中idx表示数组下标,key表示关键值,如果该位置没有关键值,则输出NULL,每个元素占一行,如对应于上面所述hash表,它的Print结果为
0#11
1#22
2#NULL
3#47
4#92
5#16
6#3
7#7
8#29
9#8

10#NULL 

Sample Input
 Copy sample input to clipboard
5Add 1Add 5Add 6Query 1Query 7PrintEnd
Sample Output
yesno0#51#12#63#NULL4#NULL
#include<stdio.h>#include <string.h>#include<stdlib.h>int main(){int hash_len;int j;long long key[10000];int hash[10000];char op[10];for(int i=0;i<10000;i++)hash[i]=-1;int query;scanf("%d",&hash_len);int jj=0;while(1){       scanf("%s",op);       if(strcmp(op,"End")==0)        break;        if(strcmp(op,"Add")==0){            scanf("%lld",&key[jj]);            int h = key[jj]%hash_len;//哈希取模            int conflic = 1;//用于解决冲突的计数器            int ii=0;            while(1){                 if(hash[h]==-1) {//没有哈希地址冲突                        hash[h] = key[jj];                       break;                }                 else {                h= h+conflic*conflic-ii*ii;                if((h+conflic*conflic-ii*ii)>=hash_len){                        h%=hash_len;//链表循环                    }                ii++;                conflic++;                 }                          }       jj++;        }        if(strcmp(op,"Print")==0){            for(int i=0;i<hash_len;i++){               printf("%d",i);               printf("#");               if(hash[i]==-1)                   printf("NULL\n");else                   printf("%d\n",hash[i]);            }        }        if(strcmp(op,"Query")==0){            int exit=0;            scanf("%d",&query);            for(int i=0;i<hash_len;i++){                if(hash[i]==query)                    exit=1;            }                    if(exit)                        printf("yes\n");                else                    printf("no\n");            }        }return 0;}                                 



原创粉丝点击