资源简介
1)设计几个不同的哈希函数,比较他们的地址冲突率(可以用更大的名字集合做实验)。
(2)研究这30个人名的特点,努力找一个哈希函数,使得对于不同的拼音名一定不发生地址冲突。
(3)在哈希函数确定的前提下尝试各种不同处理冲突的方法,考察平均查找长度的变化和造好的哈希表中关键字的聚集性。
代码片段和文件信息
#include
#include//time用到的头文件
#include//随机数srand用到的头文件
#include//toascii()用到的头文件
#include//查找姓名时比较字符串用的头文件
#define HASH_LEN 50//哈希表的长度
#define P 43//小于哈希表长度的P
#define NAME_LEN 30//姓名表的长度
int d[30] i j;
typedef struct
{
char name[20];
int m;
}NAME;
typedef struct
{
char name[20];
int m;
int si;
}HASH;
NAME Name[HASH_LEN];
HASH Hash[HASH_LEN];
void InitName()
{ printf(“请输入姓名\n“);
for(i=0;i<30;i++){
printf(“请输入第%d位姓名:“i+1);
gets(Name[i].name);
}
for(i=0;i int s=0;
for(int j=0;j<20;j++)//将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
{
s=s+toascii(Name[i].name[j]);
}
Name[i].m=s;}
}
void CreatHash()
{
for(i=0;i {
Hash[i].name[20]=NULL;
Hash[i].m =0;
Hash[i].si=0;
}
for(i=0;i {
int sum=1j=0t;
int adr=(Name[i].m)%P; //除留余数法H(key)=key%P,除数为P=43
if(Hash[adr].si==0) //如果不冲突,将姓名表赋值给哈希表
{
Hash[adr].m =Name[i].m;
strcpy(Hash[adr].nameName[i].name);
Hash[adr].si=1;
}
else //如果冲突
{
t=adr; //线性探测法处理冲突
for(;Hash[adr].si!=0&&adr {
sum=sum+1;//每次查找,查找次数+1
if(adr==HASH_LEN-1)//如果找到最后一个仍然没有位置
{
for(;Hash[adr].si!=0&&adr sum=sum+1;//每次查找,查找次数+1
if(adr==t) printf(“哈希表已满\n“);//如果找到上次的位置仍然没有,则输出哈希表已满
}
}
Hash[adr].m =Name[i].m; //将姓名表复制给哈希表对应的位置上
strcpy(Hash[adr].nameName[i].name);
Hash[adr].si=sum;
}
}
}
void DisplayName()//显示姓名表
{
printf(“\n地址 \t\t 姓名 \t\t 关键字\n“);
for (i=0;i printf(“%2d %18s \t\t %d \n“iName[i].nameName[i].m);
}
void DisplayHash()// 显示哈希表
{
float asl=0.0;
printf(“\n\n 地址 \t\t 姓名 \t\t 关键字 \t 搜索长度\n“); //显示的格式
for (i=0;i {
printf(“%2d %1
- 上一篇:粒子滤波目标跟踪算法
- 下一篇:C++扫雷游戏最全源代码
评论
共有 条评论