研究散列(Hashing)算法的体会
2008-08-18 15:20
316 查看
散列,虽然只支持二叉查找树所允许的一部分操作,但是散列具有以常数平均时间执行插入、删除和查找的特点。
散列无法有效支持元素间排序的操作,因此像findMax、findMin以及在线性时间内按顺序打印所有元素的操作都无法支持。
为了解决散列冲突问题,普遍存在两种方式,
一、分离链接法(separate chaining),其做法是将散列到同一个位置的元素以一个链表的方式保存。通常产生冲突的元素被插入到链表的最前面,这样不仅方便,而且由于最后插入的元素最有可能不久再使用,这样在查找起来效率会增加。分离链接实现简单,但是双向链表会占用额外的内存,冲突严重时,查找效率也会严重下降。
二、探测散列表(probing hash tables),其做法是发生冲突时,尝试使用其他的单元,知道找到空闲的单元为止。因为要确保所有的元素都能插入到表中,所需要的表要比分离链接法的表大,其装填因子应该低于λ=0.5。
探测散列表又有三种解决冲突的方法,一种是线性探测,即逐个探测f(i)=i。优点是算法简单,缺点是存在“一次聚集”问题(Primary Clustering)。另一种是平方探测,即f(i)=i2。对于平方探测,表的大小是素数,那么当表至少有一半是空的时候,总能插入一个新的元素。虽然平方探测排除了一次聚集,但是散列到同一位置上的那些元素将探测相同的备选单元,即“二次聚集”(Secondary Clustering)。最后一种是双散列(double hashing),一种流行的选择是f(i)=i*hash2(x)。这个公式表明需要用到第二个散列函数用来解决冲突。诸如hash2(x)=R-(x mod R),R是小于TableSize的素数这样的函数将起到良好的作用,它可以尽可能做到在第一次散列到同样单元的元素,第二次散列到不同的其他元素上,即使会发生最坏的情况,但是非常少。
研究散列算法让我联系到另外一个应用,就是产生不重复的随机数,例如卡管理系统。都需要产生不规则的随机数作为卡号或密码,记得遇到一个类似的系统是通过产生可以重复的随机数(20位左右),利用数据库唯一索引检查,避免出现重复。不过运行时间长后,由于数据量越来越大,执行效率低的可怕。现在想起来,其实就是一个解决插入冲突的问题,分段的hashing算法就是一个解决办法不是。
相关文章推荐
- 研究散列(Hashing)算法的体会
- 经典算法研究系列:五、红黑树算法的实现与剖析
- 一年去雾算法研究的总结。
- 基于Matlab的MMSE的语音增强算法的研究
- 一年去雾算法研究
- 图像处理--角点检测(Harris以及其他算法研究)
- java中关于爬楼梯算法的研究
- 智能优化算法对TSP问题的求解研究
- GIS缓冲区算法对比研究(Buffer Algorithm)
- H.264/AVC 标准中CAVLC 和CABAC 熵编码算法研究
- 中文分词算法的初步研究
- SQL存储过程分页算法研究(支持千万级)
- 数据同步算法研究
- 程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结
- 图像识别算法研究(1)---二值化概述
- 新研究旨在用“黑箱”算法解决人工智能偏差问题
- 局部特征点检测与匹配算法研究
- 随机数生成算法的研究
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典