哈希表例子1
来源:互联网 发布:浙师大行知学院 编辑:程序博客网 时间:2024/04/29 13:50
1:问题描述
(3) 查找哈希表
原文地址:http://blog.csdn.net/zouchunlaigo1988/article/details/7163920
针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2:基本要求
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
3:数据结构设计
#define NAME_NO 30#define HASH_LENGTH 50 #define M 50typedef struct{char *py;int k;}NAME;typedef struct {char *py;int k;int si;}HASH;NAME NameList[30];HASH HashList[HASH_LENGTH];
4:主要算法设计
(1)姓名(结构体数组)初始化
名字以拼音的形式够成字符串,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。void init_namelist(){int i; int j;int s0;char *p;NameList[0].py="chenliang";//陈亮 NameList[1].py="chenyuanhao";//陈元浩 NameList[2].py="chengwenliang";//程文亮 NameList[3].py="dinglei";//丁磊 NameList[4].py="fenghanzao";//冯汉枣 NameList[5].py="fuzongkai";//付宗楷 NameList[6].py="hujingbin";//胡劲斌 NameList[7].py="huangjianwu";//黄建武 NameList[8].py="lailaifa";//赖来发 NameList[9].py="lijiahao";//李嘉豪 NameList[10].py="liangxiaocong";//梁晓聪 NameList[11].py="linchunhua";//林春华 NameList[12].py="liujianhui";//刘建辉 NameList[13].py="luzhijian";//卢志健 NameList[14].py="luonan";//罗楠 NameList[15].py="quegaoxiang";//阙高翔 NameList[16].py="sugan";//苏淦 NameList[17].py="suzhiqiang";//苏志强 NameList[18].py="taojiayang";//陶嘉阳 NameList[19].py="wujiawen";//吴嘉文 NameList[20].py="xiaozhuomin";//肖卓明 NameList[21].py="xujinfeng"; //许金峰 NameList[22].py="yanghaichun";//杨海春 NameList[23].py="yeweixiong";//叶维雄 NameList[24].py="zengwei";//曾玮 NameList[25].py="zhengyongbin";//郑雍斌 NameList[26].py="zhongminghua";//钟明华 NameList[27].py="chenliyan";//陈利燕 NameList[28].py="liuxiaohui";//刘晓慧 NameList[29].py="panjinmei";//潘金梅 for (i=0; i<NAME_NO; i++){s0 = 0;p = NameList[i].py;for (j=0; *(p+j)!='\0'; j++){s0 += *(p+j);}NameList[i].k = s0;printf("%13s %d\n", NameList[i].py, NameList[i].k%M );}}
(2) 建立哈希表
用除留余数法构建哈希函数,用伪随机探测再散列法处理冲突
void CreateHashList(){int i ;int j;int collision_cnt = 0;for (i=0; i<HASH_LENGTH; i++){HashList[i].py = "";HashList[i].k = 0;HashList[i].si = 0;}for (i=0; i<NAME_NO; i++){int sum = 0;int adr = (NameList[i].k)%M;int d = adr;collision_cnt = 0;if (HashList[adr].si == 0){printf("\e[48;5;9m success adr %d\e[0m\n", d);HashList[adr].k = NameList[i].k;HashList[adr].py = NameList[i].py;HashList[adr].si=1;}else{do{collision_cnt++;printf("collision adr=%d\n", d);d = (d+NameList[i].k%10+1)%M;sum +=1;printf("new adr %d, collision_cnt = %d\n",d, collision_cnt);if (collision_cnt>10) {printf("*******fail********\n");goto out;}}while(HashList[d].k != 0);printf("\e[48;5;9m success adr %d\e[0m\n", d);HashList[d].k = NameList[i].k;HashList[d].py = NameList[i].py;HashList[d].si = sum+1;}}out:printf("----------------------------------------\n");j = 0;for(i=0; i<HASH_LENGTH; i++){if (HashList[i].k != 0){j++;printf("%d:%13s, %d, %d\n",i, HashList[i].py, HashList[i].k, HashList[i].si );}else{printf("%d:empty!\n", i);}}printf("-----------totall = %d-------------\n", j);}
(3) 查找哈希表
void FindList(){char name[20] = {0};int adr;int d;int sum=1;int i;int s0 = 0;printf("please input pinyin\n");scanf("%s", name);for (i=0; i<20; i++){if(name[i] != '\0')s0 += name[i];}printf("to find: name:%s, key:%d\n", name, s0);adr = s0%M;d = adr;if ((HashList[adr].k == s0) && (strcmp(HashList[adr].py, name) == 0))printf("find name:%s key=%d, length=1\n", HashList[d].py, s0);else if (HashList[adr].k == 0)printf("no record\n");else{do{d = (d+s0%10+1)%M;sum++;if (HashList[d].k == 0){printf("no record!\n");break;}if ((HashList[d].k == s0) && (strcmp(HashList[d].py, name) == 0)){printf("find name:%s, key:%d, search_len=%d\n", HashList[i].py, s0, sum);break;}}while(1);}}
完整代码:
#include <stdio.h>#include <string.h>#include <unistd.h>#define NAME_NO 30#define HASH_LENGTH 50 #define M 50typedef struct{char *py;int k;}NAME;typedef struct {char *py;int k;int si;}HASH;NAME NameList[30];HASH HashList[HASH_LENGTH];void init_namelist(){int i; int j;int s0;char *p;NameList[0].py="chenliang";//陈亮 NameList[1].py="chenyuanhao";//陈元浩 NameList[2].py="chengwenliang";//程文亮 NameList[3].py="dinglei";//丁磊 NameList[4].py="fenghanzao";//冯汉枣 NameList[5].py="fuzongkai";//付宗楷 NameList[6].py="hujingbin";//胡劲斌 NameList[7].py="huangjianwu";//黄建武 NameList[8].py="lailaifa";//赖来发 NameList[9].py="lijiahao";//李嘉豪 NameList[10].py="liangxiaocong";//梁晓聪 NameList[11].py="linchunhua";//林春华 NameList[12].py="liujianhui";//刘建辉 NameList[13].py="luzhijian";//卢志健 NameList[14].py="luonan";//罗楠 NameList[15].py="quegaoxiang";//阙高翔 NameList[16].py="sugan";//苏淦 NameList[17].py="suzhiqiang";//苏志强 NameList[18].py="taojiayang";//陶嘉阳 NameList[19].py="wujiawen";//吴嘉文 NameList[20].py="xiaozhuomin";//肖卓明 NameList[21].py="xujinfeng"; //许金峰 NameList[22].py="yanghaichun";//杨海春 NameList[23].py="yeweixiong";//叶维雄 NameList[24].py="zengwei";//曾玮 NameList[25].py="zhengyongbin";//郑雍斌 NameList[26].py="zhongminghua";//钟明华 NameList[27].py="chenliyan";//陈利燕 NameList[28].py="liuxiaohui";//刘晓慧 NameList[29].py="panjinmei";//潘金梅 for (i=0; i<NAME_NO; i++){s0 = 0;p = NameList[i].py;for (j=0; *(p+j)!='\0'; j++){s0 += *(p+j);}NameList[i].k = s0;printf("%13s %d\n", NameList[i].py, NameList[i].k%M );}}void CreateHashList(){int i ;int j;int collision_cnt = 0;for (i=0; i<HASH_LENGTH; i++){HashList[i].py = "";HashList[i].k = 0;HashList[i].si = 0;}for (i=0; i<NAME_NO; i++){int sum = 0;int adr = (NameList[i].k)%M;int d = adr;collision_cnt = 0;if (HashList[adr].si == 0){printf("\e[48;5;9m success adr %d\e[0m\n", d);HashList[adr].k = NameList[i].k;HashList[adr].py = NameList[i].py;HashList[adr].si=1;}else{do{collision_cnt++;printf("collision adr=%d\n", d);d = (d+NameList[i].k%10+1)%M;sum +=1;printf("new adr %d, collision_cnt = %d\n",d, collision_cnt);if (collision_cnt>10) {printf("*******fail********\n");goto out;}}while(HashList[d].k != 0);printf("\e[48;5;9m success adr %d\e[0m\n", d);HashList[d].k = NameList[i].k;HashList[d].py = NameList[i].py;HashList[d].si = sum+1;}}out:printf("----------------------------------------\n");j = 0;for(i=0; i<HASH_LENGTH; i++){if (HashList[i].k != 0){j++;printf("%d:%13s, %d, %d\n",i, HashList[i].py, HashList[i].k, HashList[i].si );}else{printf("%d:empty!\n", i);}}printf("-----------totall = %d-------------\n", j);}void FindList(){char name[20] = {0};int adr;int d;int sum=1;int i;int s0 = 0;printf("please input pinyin\n");scanf("%s", name);for (i=0; i<20; i++){if(name[i] != '\0')s0 += name[i];}printf("to find: name:%s, key:%d\n", name, s0);adr = s0%M;d = adr;if ((HashList[adr].k == s0) && (strcmp(HashList[adr].py, name) == 0))printf("find name:%s key=%d, length=1\n", HashList[d].py, s0);else if (HashList[adr].k == 0)printf("no record\n");else{do{d = (d+s0%10+1)%M;sum++;if (HashList[d].k == 0){printf("no record!\n");break;}if ((HashList[d].k == s0) && (strcmp(HashList[d].py, name) == 0)){printf("find name:%s, key:%d, search_len=%d\n", HashList[i].py, s0, sum);break;}}while(1);}}int main(void){init_namelist();CreateHashList();FindList();return 0;}
原文地址:http://blog.csdn.net/zouchunlaigo1988/article/details/7163920
0 0
- 哈希表例子1
- Java 哈希表例子
- 哈希表例子2
- 哈希表的例子
- 1-jacob 例子1
- GDB调试例子1
- make文件例子1
- 电子商务成功例子1:
- C++练笔例子1
- java mail例子(1)
- jpa 应用例子1
- 多线程例子(1)
- 简单Remoting例子(1)
- netlink例子(1)
- xml例子1
- 线程1例子
- JavaScript例子1
- compass入门例子1
- win10快捷键
- 转录组数据分析——从前期质量控制到mapping
- angular js 各种功能函数介绍
- hdu5773(2016多校第四场,最长上升子序列n*logn变形)
- 31.素数
- 哈希表例子1
- 关于ddpush的一些处理
- JS整理 insertAdjacentElement、insertAdjacentHTML、insertAdjacentText
- 整理:一种有限状态机的C语言实现
- 入门SAP PP的学习流程(转载)
- 32.数数
- 今年暑假不AC
- C++复习之实现标准库的字符串操作函数
- ClearEditText带清除功能控件