链地址法解决Hash冲突
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}//else
}//for
}
5输出Hash地址
void print(Hashtable &list)
{
node *p;
for(int i=0;i<length;i++)
{
p=list[i].next;
if(list[i].flag==0)
cout<<"第"<<i<<"个记录为空"<<endl;
else
1.建立Hash表
2.输出哈希地址
3.计算平均查找长度
三、详细设计
1、定义头文件
#include<iostream>
#define MAX 30
using namespace std;
2、元素类型、节点类型和辅助变量
typedef struct node
{
int key;//关键字
int flag;//有数据的标志
list[i].l=0;//初始化为0
list[i].next=NULL;//初始化为0table(Hashtable &list)//创建hash表
{
cout<<"输入哈希表空间的长度"<<endl;cin>>length;//从键盘输入长度
cout<<"输入Hash函数的余数"<<endl;cin>>mod;//输入余数
{
cout<<"第"<<i<<"个记录为"<<list[i].key<<"->";
list[i].l++;
while(p!=NULL)
{
cout<<p->key<<"->";
p=p->next;
list[i].l++;//长度加1
}//while
cout<<endl;
}//esle
}//for
}
6计算ASL
cout<<"输入数据的个数"<<endl;cin>>account;//输入数据的个数
int date;//临时变量用来输入数据
for(int i=0;i<account;i++)//输入数据
{
cout<<"输入第"<<i+1<<"个数据"<<endl;
cin>>date;
int n=date%mod;
在计算平均查找长度时经分析我发现,如果设Hash表连出的单链表长度为n;则长度为1的出现1次,长度2出现1次.......所以对总的查找长度贡献了n*(n+1)/2次,所以我们在哈希表中设置l表示单链表的长度,那么总的查找长度就是 l*(l+1)/2(从i=0,到i=表长度-1)
本程序的设计思路是:
double accountASL(Hashtable &list)//统计平均查找长度
{
double sum=0;//累加
for(int i=0;i<length;i++)
sum=list[i].l*(list[i].l+1.0)/2.0+sum;
return sum/length;
}
7,主函数部分
很多的知识是有联系的,比如说这次的用链地址发解决Hash冲突和图那一章中临街表的存储是很相似的!
int main()
{
Init_table(table);
creat_table(table);
print(table);
cout<<"平均查找长度"<<accountASL(table)<<endl;
return 0;
}
四、调试分析
由于本次试验较前几次简单所以本次做程序很快,没出现什么逻辑错误,出现的都是些语法错误。
int l;//每个结点引出的链表长度
node *next;
}Hashtable[MAX];
Hashtable table;
3,初始化Hash
void Init_table(Hashtable &list)//初始化Hash表
{
for(int i=0;i<MAX;i++)
{
list[i].flag=0;//初始化为0表示没有数据
if(list[n].flag==0)//该位置为空则插入到该地址,flag变为1
{
list[n].key=date;
list[n].flag=1;
}
else//否则链地址解决冲突
{
node *p;p=new node;//定义指针变量p并开辟地址
p->key=date;
p->next=list[n].next;list[n].next=p;//前插
五、运行结果
输入:
输出:
六、实验环境
(1)Windows XP系统下
(2)编程环境:VC6.0++,TC2.0
七、实验体会
数据结构试验马上就介绍了,这门课也快要结束了。面对这门课,真的有很多的话要说。从刚开始的云里雾里,迷迷糊糊走过了十几周。虽然现在还是有很多的不懂和迷茫,但是通过这十几周的学习,虽然学的很艰难,但是还是有提高的,尽管程度还很不好!其实真的,不管做什么,做了就会有收获,不管是哪方面的受益。
实验5 链地址法解决Hash冲突
一、需求分析
1、输入的必须是数字。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3、程序执行的命令包括:
(1)输入哈希表的长度、余数等和数据,初始化后创建哈希表。
(2)输出哈希表。
(3)计算平均查找长度
4、测试数据
数据:{ 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89 }
哈希函数为:Hash(key)=key mod 11。
二、概要设计
在建立哈希表的过程中,用链地址解决哈希冲突,思想史将具有相同哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。
}//for
}
5输出Hash地址
void print(Hashtable &list)
{
node *p;
for(int i=0;i<length;i++)
{
p=list[i].next;
if(list[i].flag==0)
cout<<"第"<<i<<"个记录为空"<<endl;
else
1.建立Hash表
2.输出哈希地址
3.计算平均查找长度
三、详细设计
1、定义头文件
#include<iostream>
#define MAX 30
using namespace std;
2、元素类型、节点类型和辅助变量
typedef struct node
{
int key;//关键字
int flag;//有数据的标志
list[i].l=0;//初始化为0
list[i].next=NULL;//初始化为0table(Hashtable &list)//创建hash表
{
cout<<"输入哈希表空间的长度"<<endl;cin>>length;//从键盘输入长度
cout<<"输入Hash函数的余数"<<endl;cin>>mod;//输入余数
{
cout<<"第"<<i<<"个记录为"<<list[i].key<<"->";
list[i].l++;
while(p!=NULL)
{
cout<<p->key<<"->";
p=p->next;
list[i].l++;//长度加1
}//while
cout<<endl;
}//esle
}//for
}
6计算ASL
cout<<"输入数据的个数"<<endl;cin>>account;//输入数据的个数
int date;//临时变量用来输入数据
for(int i=0;i<account;i++)//输入数据
{
cout<<"输入第"<<i+1<<"个数据"<<endl;
cin>>date;
int n=date%mod;
在计算平均查找长度时经分析我发现,如果设Hash表连出的单链表长度为n;则长度为1的出现1次,长度2出现1次.......所以对总的查找长度贡献了n*(n+1)/2次,所以我们在哈希表中设置l表示单链表的长度,那么总的查找长度就是 l*(l+1)/2(从i=0,到i=表长度-1)
本程序的设计思路是:
double accountASL(Hashtable &list)//统计平均查找长度
{
double sum=0;//累加
for(int i=0;i<length;i++)
sum=list[i].l*(list[i].l+1.0)/2.0+sum;
return sum/length;
}
7,主函数部分
很多的知识是有联系的,比如说这次的用链地址发解决Hash冲突和图那一章中临街表的存储是很相似的!
int main()
{
Init_table(table);
creat_table(table);
print(table);
cout<<"平均查找长度"<<accountASL(table)<<endl;
return 0;
}
四、调试分析
由于本次试验较前几次简单所以本次做程序很快,没出现什么逻辑错误,出现的都是些语法错误。
int l;//每个结点引出的链表长度
node *next;
}Hashtable[MAX];
Hashtable table;
3,初始化Hash
void Init_table(Hashtable &list)//初始化Hash表
{
for(int i=0;i<MAX;i++)
{
list[i].flag=0;//初始化为0表示没有数据
if(list[n].flag==0)//该位置为空则插入到该地址,flag变为1
{
list[n].key=date;
list[n].flag=1;
}
else//否则链地址解决冲突
{
node *p;p=new node;//定义指针变量p并开辟地址
p->key=date;
p->next=list[n].next;list[n].next=p;//前插
五、运行结果
输入:
输出:
六、实验环境
(1)Windows XP系统下
(2)编程环境:VC6.0++,TC2.0
七、实验体会
数据结构试验马上就介绍了,这门课也快要结束了。面对这门课,真的有很多的话要说。从刚开始的云里雾里,迷迷糊糊走过了十几周。虽然现在还是有很多的不懂和迷茫,但是通过这十几周的学习,虽然学的很艰难,但是还是有提高的,尽管程度还很不好!其实真的,不管做什么,做了就会有收获,不管是哪方面的受益。
实验5 链地址法解决Hash冲突
一、需求分析
1、输入的必须是数字。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3、程序执行的命令包括:
(1)输入哈希表的长度、余数等和数据,初始化后创建哈希表。
(2)输出哈希表。
(3)计算平均查找长度
4、测试数据
数据:{ 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89 }
哈希函数为:Hash(key)=key mod 11。
二、概要设计
在建立哈希表的过程中,用链地址解决哈希冲突,思想史将具有相同哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构。