哈希表

哈希表

哈希表是一种高效的数据结构。它的最大优点就是把数据存储和查找和所消耗的

时间大大减少,几乎可以看成是O(1),而代价是消耗较多的内存。


哈希表的基本原理

哈希表的基本原理是使用一个下标范围比较大的数组A来存储元素,设计一个函

数h,对于要存储的线性表的每个元素node,取一个关键字key,算出一个函数值h(key),

把h(key)作为数组下标,用A[h(key)]来存储node。


冲突处理

由于不能保证每个元素的关键字与函数值是一一对应的,对于不同元素计算产生同样

的函数值,就要进行相应处理。

基本的方法有:

1)拉链法:当冲突出现时,就拉出一条链,建立链接的方式的子表。

2)开地址法:在冲突发生时,用某种方法在基本存储区域内形成一个探寻序列,直到找到

空闲的地址。


哈希函数的相关操作

void init_hashtable(int *arr, int size)//初始化hashtable
{
	int 	i;
	for(i = 0; i < size; i++)
		arr[i] = -1;
}

int hash(int value, int size)
{
	return value % size;//除余法
}

int locate(int *arr, int size,int value)
{
	int		index,i;
	index = hash(value);
	i = 0;
	
	while(i < size && arr[(index + i) % size] != value && arr[(index + i)%size] != -1 )
		i++;//出现冲突,采用开地址法,向下一位探寻是否冲突
	
	return (index + i) % size;
}

int insert_table(int *arr, int size, int value)
{
	int 	index = locate(arr,size,value);
	if(arr[index] == -1)
		arr[index] = value;
	else//table满了或者是此元素已经存在
		return -1;
	return 1;
}

int search_table(int *arr, int size, int value)
{
	int 	index = locate(arr,size,value);
	if(arr[index] == value)
		return index;
	return -1;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值