基础知识学习1之哈希(Hash)
来源:互联网 发布:is语音淘宝客服可信吗 编辑:程序博客网 时间:2024/06/06 01:20
1.理解
1.1 基本概念理解
哈希, Hash的音译,也有翻译做“散列”。 可以理解为映射的一种。T[hash[x]]=x, 通过hash函数将值x转换成T对应的下标,然后将值写到该位置.
比如除法hash: 10%9取余1,将10存在T[1].
hash平均时间要比链表快,同时可以节省比数组更少的空间。
假设关键字集合为K,关键字域为U,空间可以将至O(|K|).
hash使用的场景是数的集合比数的域小的多的情况,比如数为{1,10000},两个数,但是域是10000,2<<10000; 而数的集合{1,2},域为2=2,就没必要用hash了,使用直接寻址技术就可以了。
1.1.1 碰撞
两个关键字被映射到同一个槽(下标),称为碰撞
hash函数的目标之一:尽可能减少碰撞
1.1.2 直接寻指法
直接寻址技术,直接寻址表
T[k]=k
1.1.3 链接法
把散列在同一个槽中的所有元素都放在一个链表中
问题: 最坏情况是所有元素hash到一个槽。但使用单链表的时候,搜索和删除都很慢,O(n)
1.1.4 开放寻址法
将所有的元素都放在散列表中。 当查找一个元素的时候,需要检查所有的表项。
插入: 先hash到指定的槽,如果槽有元素,就判断下一个槽,直至找到空槽存放元素。
好处:不用指针,节省空间,
问题:散列表会出现填满的情况,以至于不能插入任何元素。
删除麻烦
1.2 相关技术
Hash function: hash函数。 常用的有:
(1) 除法散列法:hash(k)=k mod m
(2) 乘法散列法:hash(k)=INT( m(kA-INT(kA/m))
Hash table:散列表, 算法导论十一章专门讲了散列表。 Hash table中的效率很高,查找元素的期望时间为O(1),hash table 是普通数组概念的推广。Hash table但是最坏时间和链表都是一样,都是O(n)
问题:会出现最坏情况
类是的应用还有hashMap:期望查找时间很快
Hash算法:
hash在密码领域的应用:把任意长度的输入,通过散列算法,变换成固定长度的输出,输出散列值。
2.扩展:
2.1 一致性哈希算法
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用
详细见[1]
机器的删除与添加
- 节点(机器)的删除
以上面的分布为例,如果NODE2出现故障被删除了,那么按照顺时针迁移的方法,object3将会被迁移到NODE3中,这样仅仅是object3的映射位置发生了变化,其它的对象没有任何的改动 - 节点(机器)的添加
如果往集群中添加一个新的节点NODE4,通过对应的哈希算法得到KEY4,并映射到环中
其他学习总结:
【1】http://blog.csdn.net/xubo245/【2】https://github.com/xubo245/
参考:
【1】http://blog.csdn.net/hello_bravo_/article/details/54020311?locationNum=4&fps=1
- 基础知识学习1之哈希(Hash)
- Perl学习之哈希hash
- Perl学习之hash
- ruby学习之Hash
- Solaris学习之基础知识(1)
- hash基础知识
- 哈希表基础知识(hash table)(1)
- 【算法学习】Consistent Hash 一致性哈希
- android学习之基础知识
- egret学习之基础知识
- 机器学习之基础知识
- android学习之基础知识
- mysql学习之基础知识
- Spring学习之基础知识
- Python学习之基础知识
- SpringMVC学习之基础知识
- OpenCV学习之基础知识
- Python学习之基础知识
- ZCMU-1133- 第九章:致我们终将逝去的青春
- 51nod 1120 Lucas定理
- java.sql.SQLException: Lock wait timeout exceeded
- jq中的延迟对象详解
- 常见JVM问题
- 基础知识学习1之哈希(Hash)
- ARP攻击
- sonar常见问题修改
- caffe中Layer type * already registered和Unknown layer type错误
- [04]项目实战-PC 端固定布局(4)
- php5.5下安装pdflib的步骤
- HNOI2012 集合选数
- Three.JS学习 9:WEBVR 入门demo
- linux运维学习第七课