5-43 字符串关键字的散列映射 (25分)
2016-08-30 12:23
441 查看
5-43 字符串关键字的散列映射 (25分)
给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位;再用除留余数法将整数映射到长度为P的散列表中。例如将字符串AZDEG插入长度为1009的散列表中,我们首先将26个大写英文字母顺序映射到整数0~25;再通过移位将其映射为3×(32)2+4×32+6=3206;然后根据表长得到,即是该字符串的散列映射位置。发生冲突时请用平方探测法解决。
输入格式:
输入第一行首先给出两个正整数N(≤500)和P(≥2N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个字符串关键字,每个长度不超过8位,其间以空格分隔。
输出格式:
在一行内输出每个字符串关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例1:
4 11 HELLO ANNK ZOE LOLI
输出样例1:
3 10 4 0
输入样例2:
6 11 LLO ANNA NNK ZOJ INNK AAA
输出样例2:
3 0 10 9 6 1
思路
关键词:散列+回溯(这个在题目里面没有体现,但是实际代码必须实现回溯功能才能做对)+平方探测
点击访问 PTA-测验
#include <stdio.h> #include<stdlib.h> #include<string.h> /* 评测结果 时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户 2016-08-24 18:37 答案正确 22 5-43 gcc 2 1 569985011 测试点结果 测试点 结果 得分/满分 用时(ms) 内存(MB) 测试点1 答案正确 6/6 2 1 测试点2 答案正确 8/8 2 1 测试点3 答案正确 3/3 2 1 测试点4 答案正确 3/3 1 1 测试点5 答案正确 5/5 2 1 查看代码 上一次做这个哈希散列的问题我就发现一个坑。 那就是对于两个相同的数据,哈希散列要输出的时候只输出他第一次保存的位置,而不是最终保存的位置。 原因是出题的OJ利用了JAVA里现成的哈希库函数,进行读写数据,那么后面对各个数据进行问询的时候 所输出的自然就是第一次入栈是存储的位置了 */ typedef struct node *Node; struct node { char String[9]; }; int Mod(int a,int p) { while(a<0)a+=p; return a%p; } int main() { int n=1009*1009,p; //printf("%d",n); scanf("%d%d",&n,&p); while(n>p)n++;//地雷,确保p要比n大 Node*Hash=(Node*)malloc(sizeof(Node)*p); for(int i=0; i<p; i++)Hash[i]=NULL; char name[9]; for(int i=0; i<n; i++) { // getchar(); scanf("%s",name); // printf("{%s}",name); int Index=0,weight=1; for(int len=strlen(name),k=len-1; (k>=0)&&(len-k<4); k--) {//计算字符串末尾3字符的值 // printf("{%d}",k); Index+=(name[k]-'A')*weight; weight*=32; } int flag,j; for(j=0; j<=p/2; j++) {//j<=p/2是平方探测的一个重要区间,这个问题中有没它都一样 flag=Mod(Index+j*j,p); if(!Hash[flag]) break; else if(!strcmp(Hash[flag]->String,name))break; flag=Mod(Index-j*j,p);//这应该是 if(!Hash[flag]) break; else if(!strcmp(Hash[flag]->String,name))break; } if(j>p/2) {//本来是要哈希重构的,但是埋了个地雷没炸,说明给的数据还没超载 while(1)n++;//地雷 } Hash[flag]=(Node)malloc(sizeof(struct node)); strcpy(Hash[flag]->String,name); if(i)printf(" "); printf("%d",flag); } return 0; }
相关文章推荐
- PTA 7-17(查找) 字符串关键字的散列映射(25 分) 25分代码
- 5-43 字符串关键字的散列映射
- PTA-数据结构 5-42 整型关键字的散列映射 (25分)
- 字符串关键字的散列映射
- PTA 字符串关键字的散列映射(25 分)
- 《数据结构学习与实验指导》5-2:字符串关键字的散列映射
- 5-42 整型关键字的散列映射 (25分)
- PTA 字符串关键字的散列映射
- PTA 7-17 字符串关键字的散列映射
- 5-42 整型关键字的散列映射
- 《数据结构学习与实验指导》5-1:整数关键字的散列映射
- 4C的练习5-39 整型关键字的散列映射 <线性探测法>
- J2SE基础夯实系列之String字符串不可变的理解,不可变类,final关键字到底修饰了什么
- Android字符串映射找resource下资源
- Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
- 运用函数指针和STL的Map实现关键字key与成员函数的映射
- 数据结构上机4.4字符串映射加密解密
- hibernate 映射文件 当表名或字段名与数据库关键字冲突 该如何解决?
- C#匹配字符串关键字
- Qt按键键值 与 相关字符串 的映射表