Hash表算法小结

来源:互联网 发布:示范性软件学院排名 编辑:程序博客网 时间:2024/06/05 20:58

Hash 表:O(1) 时间数据的插入删除和查找,无序,查找最大数据或者最小数据的时间是 O(N) 。

通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

由于存储的数据数量远远大于 hash 表存储单元的数量,所以再好的 hash 函数也可能使不同的数据得到相同的映射位置,这就造成了冲突。但是好的 hash 函数可以将这种冲突降到最低。

解决冲突的办法:

1.借助链表

当产生冲突的时候,将两个数据都链接在同一 hash 存储单元保存的链表中。

2.开放地址

当冲突发生的时候,要再次计算新的地址。常用的开放地址法是线性探查,就是当对一个数据进行插入删除或者查找的时候,通过 hash 函数计算,发现这个位置不是要找的数据,这时候就检查下一个存储单元,一直找到要操作的数据为止。

3.完全hash表

当产生冲突的时候,第一级的 hash 与使用分离链接方法的 hash 一样,但是 hash 存储单元中指向另一个 hash 表。

4.d-left hashing

2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。将新key存储在负载少的位置。如果两边都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。

散列法

元素特征转变为数组下标的方法就是散列法。

1、除法散列法 
最直观的一种,上图使用的就是这种散列法,公式: 
      index = value % 16 
2、平方散列法 
把除法换成乘法和一个位移操作。公式: 
      index = (value * value) >> 28
3、斐波那契(Fibonacci)散列法
找出一个理想的乘数,而不是拿value本身当作乘数。
1,对于16位整数而言,这个乘数是40503 
2,对于32位整数而言,这个乘数是2654435769 
3,对于64位整数而言,这个乘数是11400714819323198485

斐波那契散列法调整之后会比原来的取摸散列法好很多。 

寻找top k

第一步、先用Hash表统计每个key出现的次数,O(N);然后第二步、采用堆数据结构找出Top 10,N*O(logK)。

哈希表的数组是定长的,太大浪费,太小低率。哈希表的尺寸一般是一个质数。

下面是哈希表尺寸大小的可能取值:
     17,            37,          79,        163,          331,  
    673,           1361,        2729,       5471,         10949,        
   21911,          43853,      87719,      175447,      350899,
  701819,         1403641,    2807303,     5614657,     11229331,   
 22458671,       44917381,    89834777,    179669557,   359339171,  
718678369,      1437356741,  2147483647

0 0
原创粉丝点击