哈希表Hash

哈希表

  • 首先建立哈希函数,我用的是除留取余法,将哈希表的表长设置为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;    //没找到
}
上一篇:Huffman树及Huffman编码的算法实现


下一篇:Redis中key-value的实现原理