计算机基础——哈希算法

哈希算法

概念

哈希表就是一种以键-值(key-value)形式进行存储的数据结构,查找时,只要输入key,就能找到对应的值。

哈希表的意义

哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度都为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只需要调整哈希函数算法即可在时间和空间上做出取舍。

使用哈希查找的两个步骤

1.使用哈希函数生成索引
在理想的情况下,不同的键会被转换为不同的索引值,的那有些情况下会出现多个件被哈希到同一个索引值的情况。所以就有了第二步
2.处理哈希碰撞
处理哈希碰撞有很多种方法

生成索引的几种方法

1.直接定址法:
根据元素本身或者它的线性函数作为哈希地址,即H(k)=k或者H(k)=a*k+b。
适用于:集合地址的大小 == 关键字集合的大小,其中a和b为常数。
2.数字分析法
设每个关键字都是由 s位数字组成的,分析关键字几种的全体,并从中提取分布均匀的若干位或者他们的组合作为地址。
适用于:能够预先估计出全体关键字的每一位上的各种数字出现的频率
3.折叠法
4.平方取中法
5.减去法
6.基数转换法
7.除留余数法
8.随机数法
9.随机乘数法
10.字符串值哈希法
11.旋转法

||| 实际应用中,应根据具体情况,灵活采用不同方法。
!计算哈希函数所需时间(简单)
!关键字的长度
!哈希表的大小
!关键字分布情况
!记录查找频率

哈希冲突的几种处理方法

主要有4种:
1.开放地址法
基本思想:当关键字key的哈希地址出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍出现冲突,那就以p产生p2,直到不再出现冲突。
优点:线性探测再散列的优点是只要哈希表不满,就一定能够找到一个不冲突的哈希地址,而二次探测再散列和伪随机探测再散列则不一定。
2.再哈希法
基本思想:同时构造多个不同的哈希函数:
**特点:**这种方法不易产生聚集,但增加了计算时间。
3.链地址法
基本思想:将所有的哈希地址为i的元素构成一个称为同一词链的单链表,单链表的头指针存在哈希表的第i个单元中。
**特点 **适用于经常进行插入和删除的情况。
4.简历公共溢出区
基本思想:将哈西便分为基本表和溢出表两部分,凡是和基本表冲突的都放入溢出表。

线性探测法

关于hash冲突的一些说法

1.通常有两类方法处理冲突,开放定址法(Open Addressing)和拉链法(Chaining).
2.链地址法(拉链法)的节点空间动态申请,更适合无法确定表长的情况。
3.拉链法的缺点是:指针需要额外的空间,故当节点规模较小时,开发定制法较为节省空间。

在java中是如何解决hash冲突的?

解决哈希冲突的方法有很多种:开放地址法,二次哈希法,链地址法,建立一个公共溢出区。

但在java.util.HashMap中,总体使用的是链地址法来解决冲突的。当然,使用链地址法使得get的效率从O(1)降至O(n),所以在java8中,使用的是平衡树来提高效率的。
参考java8中的HashMap冲突解决

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值