Hash(散列函数)简单应用引出解决散列冲突的四种方法

商店允许顾客通过电话订购商品,并在几天后上门自取。商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的)。如何组织商店的数据库,以允许更加高效的进行插入和检索操作呢?

将纸质订单表格放在10x10的箱数组中,使用客户电话号码的后两位作为散列索引(为什么将后两位作为索引而不是前两位),将订单放到合适的箱子格中。当客户来取商品时,销售人员顺序搜索对应箱子中的所有订单——这就是利用顺序搜索来解决散列冲突的开放散列。


非哈希表特点:关键字在表中的位置和本身没有确定的关系,检索的过程将每个关键字与数据库中的关键字进行比较,查找的效率取决于比较的次数(如果为顺序组织,可以进行二分检索,时间复杂度为O(log(n));如果为非顺序组织,只能顺序检索,时间复杂度为O(n))。

哈希表的特点:关键字与他的位置有确定的关系,因此插入和检索都非常方便。关键问题:1、设计好的散列函数,使得各种可能的结果尽可能随机 2、当冲突出现时,如何解决冲突

1、开放定址法

假如多个关键字key0,key1,key2,...keys经过散列函数映射为同一地址,即产生地址冲突,那么可以为这些keyi(0<=i<=s)求得一个地址序列。

H0 = H(key0)    Hi = ( H(keyi) + di ) mod m

对增量id有两种取法:1、di = 1,2,3,... (线性探测再散列)   2、 di = 1,-1,2,-2,4,-4,......k2,-k2(平方探测再散列)

2、链地址法

将哈希地址相同的元素链接在同一链表中

 

3、再哈希法

通过另一个哈希函数计算新的地址值,直到不冲突为止

4、建立公共溢出区

 

转载于:https://www.cnblogs.com/lwyeah/p/8598470.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值