散列表 - Hash Table


源自<<数据结构与算法分析c++>>

几种散列算法



int hash(const string &key, int tableSize)
{
	int hashValue = 0;
	for (int =0; i<key.length(); i++)
		hashValue += key[i];
	
	return hashValue % tableSize;
}

int hash(const string &key, int tableSize)
{
	return ( key[0] + 27*key[1] + 27^2*key[2]) % tableSize;
}

int hash(const string &key, int tableSize)
{
	int hashValue = 0;
	for (int =0; i<key.length(); i++)
		hashValue += 37*hashValue + key[i];

	hashValue  %= tableSize;
	if( hashValue < 0)
		hashValue  += tableSize;

	return hashValue ;
}


解决冲突 

1.分离链接法: 把具有相同映射的元素保存到一个链表中。


应用:

HashObj通过hash函数得到vector下标号(链表号),再再对应链表作insert/search/remove操作。

(类似的,我们还可以使用二叉树、甚至另外一个散列表。但我们期望的是如果散列表大而且散列函数好,那么所有链表都应该很短。因此不值得去进行任何复杂的尝试。)


2.  探测法

线性探测:发生冲突时,从下一个单元开始逐个查找空位

平方探测:发生冲突时,从下一个n^2单元开始查找空位  (第一次冲突1^2,第二次冲突2^2,第三次冲突3^2)

双散列:发生冲突时,用第二个散列函数查找空位


3. 再散列

当表的元素填的太满,发生冲突的概率很大,那么意味着操作的运行时间消耗过长,甚至插入操作可能失败。此时解决的方法是再建立一个大约两倍大的表。将原始散列表中的元素通过新的散列函数映射到新表中。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值