标签:Hash 哈希 int ht key address data
哈希表
- 首先建立哈希函数,我用的是除留取余法,将哈希表的表长设置为11
- 处理冲突的方法为线性探测再散列的处理冲突方法
- 哈希表中记录在处理冲突时每个元素的比较次数,按照比较次数,最终可以算出该处理冲突方法的ASL
- 除了线性探测再散列的方法,还有二次探测再散列,随机探测再散列,链地址法
#include<stdio.h>
#include<stdlib.h>
#define Datatype int
#define MaxSize 100
#define HASHSIZE 11
typedef struct
{
Datatype data; //数据
int times; //比较次数
}HASHTABLE[MaxSize]; //哈希表
//int D[HASHSIZE] = { 0,1,2,3,4,5,6,7,8,9,10 }; //递增序列
int HashFunc(int key); //哈希函数,返回关键字key的地址
void Creat(HASHTABLE ht, int DATA[], int n); //创建哈希表
void HashInsert(HASHTABLE ht, int key); //哈希表插入
int Collision(int di); //按照线性探测再散列处理冲突的方法
int Search(HASHTABLE ht, int num); //哈希表的查找
int main()
{
HASHTABLE ht;
int num;
int DATA[9] = { 19,01,23,14,55,68,11,82,36 };
Creat(ht, DATA, 9);
printf("输入要查询的数据:");
scanf("%d", &num);
if (Search(ht, num) != -1)
printf("Found!!!");
else
printf("Not Found!!!");
return 0;
}
//哈希函数,返回关键字key的地址
int HashFunc(int key)
{
return key % HASHSIZE; //用除留取余法,返回地址
}
//按照线性探测再散列处理冲突的方法
int Collision(int di)
{
return (di + 1) % HASHSIZE;
}
//创建哈希表
void Creat(HASHTABLE ht, int DATA[], int n)
{
int i;
for (i = 0; i < HASHSIZE; i++)
{
ht[i].data = NULL; //初始化
ht[i].times = 0; //初始化
}
for (i = 0; i < n; i++)
{
HashInsert(ht, DATA[i]);
}
printf("创建的哈希表如下:\n");
for (i = 0; i < n; i++)
{
printf("%d\t%d\t%d\n", i, ht[i].data, ht[i].times);
}
}
//哈希表插入
void HashInsert(HASHTABLE ht, int key)
{
int address; //地址
int times = 1;
address = HashFunc(key); //计算地址
if (ht[address].data == NULL)
{
ht[address].data = key;
ht[address].times++; //比较次数加一
}
else
{
while (ht[address].data != NULL)
{
address = Collision(address); //得到新的地址
times++;
}
ht[address].data = key;
ht[address].times = times;
}
}
//哈希表的查找
int Search(HASHTABLE ht, int num)
{
int address; //地址
address = HashFunc(num);
while (ht[address].data != NULL && ht[address].data != num) //当address的位置不为NULL时,且不等于num
{
address = Collision(address);
}
if (ht[address].data == num)
return address; //找到了,并返回地址
else
return -1; //没找到
}
标签:Hash,哈希,int,ht,key,address,data 来源: https://blog.csdn.net/fyrrr/article/details/122135692
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。