哈希表

定义

hash: 元素通过一个函数转换为整数,使得该整数可以尽量唯一地代表这个元素。其中的转换函数即称为哈希函数 H,若元素在转换前为key,那么在转换后就是一个整数H(key)。

哈希表最主要的优点是能够在O(1)时间查找某一元素,是效率最高的查找方式。但其缺点是需要利用额外的空间来实现哈希表。

哈希函数

  • 直接寻址法:恒等变换H(key) = key,即把key作为数组下标;或是线性函数H(key) = a * key + b(适合查找表较小且连续的情况,需要事先知道关键字的分布情况);
  • 数字分析法:如果关键字是位数较多的数字(比如手机号),且这些数字部分存在相同规律,则可以采用抽取剩余不同规律部分作为散列地址(适合处理关键字位数比较大的情况,知道关键字的分布且关键字的若干位分布较均匀);
  • 平方取中法:取关键字平方的中间位数作为散列地址,比如假设关键字是 4321,那么它的平方就是 18671041,抽取中间的 3 位就可以是 671,也可以是 710,用做散列地址(适合于不知道关键字的分布,而位数又不是很大的情况);
  • 折叠法:将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些),然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。比如假设关键字是 9876543210,散列表表长为三位,则我们可以将它分为四组 987|654|321|0,然后将它们叠加求和 987+654+321+0=1962,再取后 3 位得到散列地址即为 962(事先不需要知道关键字的分布,适合关键字位数较多的情况);
  • 除留余数法:H(key) = key mod p;当p取小于哈希表长的最大质数时,产生的哈希函数较好;
  • 随机数法:H(key) = random(key)(当关键字的长度不等时采用这个方法构造散列函数是比较合适的)

解决冲突

线性探查法(H(key)++)、平方探查法(H(key) ± k2)、链地址法(拉链法)–把H(key)相同的key用单链表存起来。
可以用map直接使用hash功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值