一些浅显的hash算法知识介绍

      有人可能经常听到hash,感觉很高深的样子。其实只不过他并不懂而已。hash其实是非常浅显的东西,浅显到我们几乎每天都在使用它,只不过我们并不知道而已。一份学校的名单,一个电脑里的硬盘都可以说是来自于hash算法。hash,不过就是一个对大量资料、文件的整理过程而已。让一些同类的或者说是有相似特征的放在一起,方便我们查找。而hash算法,就是一个分类的过程。就如同图书馆的书籍,如果散乱的排布,到处乱扔,想从中找到其中一本那可是一个浩大的工程。而经过分类处理,我们这可以节省大量的时间。我们知道,无论是什么电脑,其内存都是有限的。不可能在任何情况下都把所有的资料全部放入内存中供cpu去调取。这时候分类的作用就体现出来了,先把类别放入内存找到想要的类别,在把该类放入内存,一步一步找下去,直到找出为止。这样就大大节省空间和时间,这也是hash的好处。但是,空间和时间是相对的,节省空间就要浪费时间,反之也是一样的,这在后面我会讲到原因。下面我就讲一下hash的具体实现。

        相信大家都了解,数据结构就是装载数据的规则而已。实现方法充其量也就两种,数组和链表。数组,其优点在于由于下标的存在,可以很方便的查找里面的数据。但是他有其固定的长度,新加装数据就成了麻烦。而链表则可以很容易的在任何位置插入你想要的数据,但是查找起来却只能依靠遍历了。总要找一种办法来综合这两种方式,而这办法就是hash算法。把大量的数据(A)经过hash算法后,变成少量的数据(B)。因为数量上A>B的,这时,大家可以想到,这样做一定会有很多的数据A指向同一个B,这样就产生了冲突。一个hash算法,由于A和B数量不定,冲突就可能会发生。而对于做程序的我们,他就成了必然会发生,我们就要想办法解决,否则就无法分辨重复的数据了。这里主要介绍拉链法,就是把那些A数据经过hash算法得到B数据存入一个数组当中,数组的长度由可以产生的不重复的B的数量来决定。数组当中不要存入单纯的B数据,而是放入存有B数据的一个链表的节点。如果出现有一个数据经过hash出现重复,则把这个数据在建立一个链表节点加入进去。这样把所有的A数据放入之后,就初步得到了一个hash表。这里的hash算法就十分关键了,没有绝对完美的hash算法,任何算法都要结合实际情况而定。如果你想要最快的查找,最极端,做一个一比一的hash表,完全用数组来实现。你想要节省内存,直接一个链表也是可以的。但是这样又回到了最原始的问题,时间和空间的需求。所以掌握好你的环境要求,设计出最符合你的hash算法,才是最完美的。一些最简单的hash算法,如求余,移位等,选择不同数进行计算,会分别得到不同数量的B的值(hashcode),并且也相应确定了冲突概率。具体如何选择,就是实际行动中该决定的了。另外,在相同的冲突数量或者概率下,也是有优劣之分的,对于拉链法,每条链的长度尽量不要相差太过悬殊,不能一条链上链接了大量的数据,而其他链上却几乎没有,极端一点,全部数据在一条链上,这就又回到了一个普通的链表了。评价标准,这里可以参考高中所学的方差的概念。

      总而言之,hash算法是一种结合,也被现在所普遍使用可谓无处不在。现在县了解到这里,在今后的学习中我可能会在程序中测试各种hash算法的实际应用情况,敬请期待吧。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值