关于Hash

学习Java那么久,这一周的内容是研究Hash算法。
Hash算法又称为散列算法。个人认为,Hash算法就是一种存取数据的方法。通常存取数据的数据结构有两种,一种为队列,另一种为链表。这两种结构各有优势和不足。数组便于查找元素,但增加和删除元素时,所需的时空代价就会很大。至于链表,则恰恰相反,不便于查找,便于增删。若我们能将这两种结构的优点结合起来,互补不足,使得数据的增删查改的时空复杂度达到最低,岂不妙哉!而Hash算法的意义便是如此,以实现快速存取数据。
运用Hash算法,其存储数据的基本结构依然是一个数组,只不过数组中的元素不再是具体的数据,而是由一个一个节点组成的链表。数据则存储在节点中。存储数据时,每一个数据会有一个对应的关键字,即key值,不同数据的key值可以相同,相同key值的数据便存放在一个链表下。然后查找的时候,先通过key值确定数据在数组中的位置,然后通过遍历算法遍历链表,即找到所需的数据。
关于Hash算法,还有几个相关的概念,解释一下:
一、冲突
即不同数据的key值对应到同一个存储位置的情况。一个简单的解决方法就是添加到该位置中已存在的链表的末尾。
二、阀值
链表的长度不能无限制增加,如果太长了就又会使得查找不方便,所以链表长度会有一个上限。
三、ReHash
若链表长度已经达到上限,那么就需要重新排列数据,重排数据后,要求查找数据时通过key值依然能找到原来的数据。

个人感觉,Hash函数是个很奇妙的东西,所以自己动手写了写,测试代码见附件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值