算法
算法范式
http://www.cnblogs.com/gaochundong/p/algorithmic_paradigms.html
Dijkstra算法:
https://www.jianshu.com/p/ff6db00ad866
- P7 哈希表
动态集合:能做增删改的集合,静态集合:只能做查询的集合。
哈希函数对应映射一对一。而不能多对一,如果有多对一的情况就发生了碰撞
碰撞的解决方法:链表
简单均匀哈希:每一个集合S都有相同的集合机会加入T里面任意一个槽。且每个键之间独立
键和槽:
好的函数函数:键的分布特性不会影响到插入槽的均匀性。
除法哈希:m=n mode(d),d是槽的个数;
m选择质数,且不靠近2或10
乘法哈希函数:A不要取2的幂次的数,
二进制数的特征要么高位很多相同,要么低位很多相同??什么意思
这个乘法运算就相当于是把整个 哈希表分成r份,然后以A倍的乘积来让值在这个哈希表上循环找值,最后确定下来。
开放寻址法:系统地探查序列直到找到空槽为止;要求n<=m,不然会溢出
链表法需要在原本的表里面添加很多链表
搜索也用相同的探查列表,而且搜索的次数不会超过最长探查次数
线性探查:缺点:容易出现集群性,某一块区域被占满,而且这个区域会越来越长:i=1:一次集群性;i=2,二次集群性。
用两个哈希函数做二次哈希,保证h1(k),然后不断叠加h2(k),m=2r次幂,h2(k)为奇数就可以让所有的槽都分配到。
浙公网安备 33010602011771号