`
helloyesyes
  • 浏览: 1309716 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

动态哈希(dynamic hashing)

阅读更多
随着存储设备越来越便宜,哈希表以空间换时间的策略也越来越吃香,而其它如二叉树、红黑树、B树,都因为查询速度不够或实现太复杂而在实战中渐渐不被使用。在日益增大的存储需求下,拥有固定slot(桶)数的静态哈希表已经无法适应需要,动态哈希表便应运而生了。
动态哈希表通常是在发生冲突后slot数量翻倍增长,而增长后毕竟哈希函数也变了,所以还要把旧slot里的元素重新放置。这种简单的动态哈希(dynamic hash)算法便是SGI版的STL中hash_map的实现。但如果每次调整slot都要全部重放元素,效率太低,且数据插入的时间也太不均匀:某次插入元素,发生了冲突,于是所有元素重新放置,老半天后这个元素才能插入完毕。作为实时系统,这一突如其来的延时当然是不可忍受的。
为了让数据更新的时间更为均匀,数据库大师Per-Ake Larson便提出了一种新的动态哈希算法,其实中心思想也很简单(“简单是可靠的前提”——Dijkstra):每次slot数量增长一倍,不是重新放置所有slot中的元素,而只移动一个slot内的元素——就是新增slot的那个兄弟slot(Buddy Slot)。如下:
dynamic hashing
slot增长前如图a,key为0、6的元素都可以放得下,但当key为12的元素到来时,编号为1的slot里有冲突了,这时需要将slot数翻一倍了,于是变成了图b。此时slot数由原来的4变为了现在的8,但“有效的”slot只有5个:编号分别为0到4。key为12的元素放入4号slot,因为12除8余4。按照一般的Larson策略来讲,4号slot的“兄弟slot”是0号slot,所以在增长完成后0号slot里所有除8余4的元素都要移到“新slot”即4号slot里,举个例子:如果0号slot里有key为16、20、24、28的元素,那key为20、28的元素必须移到4号slot,其它的(16和24)留在0号slot。
只更新一个slot的代价是——查询要稍微复杂些:先用8去除key,如果余数对应的slot“不存在”,则再用4去除,得到正确的slot编号。例如查询6,先 6 mod 8 得6,6号slot还不存在(只是分配了内存,数据结构上还不存在),所以只能再除4,得2,到2号slot去找,找到。图b右下方的公式可能有一些误导:它通过看s(k)是否小于n(<=5)来判断对应的slot是否存在,而在通常的情况下,增长的slot可能不是4号。假如增长的是6号,这时4、5、7号slot是“不存在”的,再用这个公式硬套就不行了。所以关键的判断标准是slot“是否存在”,而不是编号本身是大是小。
Per-Ake Larson的这一经典动态哈希算法以一小点查询时间的损失换来了数据更新的高效和平滑,因此得到了广泛的使用:GNU的gdbm、Berkeley的ndbm、雅虎的mdbm,都是使用这个算法。
分享到:
评论

相关推荐

    Fast k-Nearest Neighbour Search via Dynamic Continuous Indexing

    论文中提出的随机算法不仅在理论上具有吸引力,而且在实验中显示出比局部敏感哈希(Locality-Sensitive Hashing, LSH)有更好的近似质量和速度。 局部敏感哈希是一种用于解决近似最近邻搜索问题的算法,尽管它在...

    LSH.zip_Basic LSH_LSH MT_locality sensitive_time series_局部敏感哈希

    对于时间序列数据,我们关心的是序列之间的相似度,如动态时间规整(Dynamic Time Warping, DTW)距离或者欧氏距离。LSH可以被调整以适应这类数据的特性。例如,可以通过滑动窗口来提取时间序列的特征,然后对这些...

    基于迭代哈希和具有局部上下文的动态接缝线的视频拼接

    2. 动态接缝线(Dynamic seam-line):与局部上下文模型相结合,以改善视频融合的质量。该方法能够消除视频拼接过程中的重影和光照变化问题。 3. 图像注册(Image registration):这是视频拼接中的关键技术,它...

    连接位极大似然动态过滤算法

    知识点四:动态阈值过滤算法(Dynamic Threshold Filtering) 动态阈值过滤算法涉及根据数据分布或特性实时调整过滤阈值,以优化过滤性能和结果的准确度。在文档中,这种技术被用来进一步提升过滤过程的效率。 知识...

    论文研究-基于词语权重的改进DSC中文网页去重算法 .pdf

    传统的网页去重算法通常通过哈希(Hashing)方法来识别网页的相似性,但这种方法在处理中文文本时可能存在局限性,因为中文字符的编码复杂度和语言的语义表达方式使得简单地进行哈希比较往往不够准确。 改进的DSC...

    KinectFusion 和 ElasticFusion 三维重建方法

    KinectFusion的核心在于使用了体素哈希(Voxel Hashing)技术和直接法ICP(Iterative Closest Point)算法来对每一帧的深度图像进行处理,并实时地将处理结果融合到一个全局的三维模型中。该方法主要适用于小到中等...

    关联规则挖掘算法

    除了Apriori算法之外,还有其他几种有效的关联规则挖掘算法,如DHP(Dynamic Hashing and Pruning)、PARTITION和FPGrowth(FP-Growth)等。DHP算法利用哈希表来存储项集的支持度计数,从而减少数据库扫描的次数。...

    lrucacheleetcode-beihu-leetcode:力扣算法

    Hashing 哈希 Greedy 贪婪算法 Resursion/Backtrace 递归/回溯 Traversal 遍历 前中后序(In-Order/Pre-Order/Post-Order) Breadth-first/Depth-first search 广度优先、深度优先 Divide and Conquer 分而治之 ...

    具有动态客户请求和交通信息的多目标Memetic算法

    本文介绍了一种新型的多目标遗传算法(Memetic Algorithm, MA),特别设计用于解决带有动态客户请求及实时交通信息的一对多一对(1-to-many-to-1)的动态拣取与配送问题(Dynamic Pickup and Delivery Problem, DPDP...

    QtCryptoHash:轻量级的Qt C ++库,提供QCryptographicHash不支持的某些加密哈希算法

    QtCryptoHash是一个Qt C ++库,它提供了一种从Qt库计算QCryptographicHash类不支持的加密哈希的方法。 产品特点 支持Tiger-192 , RipeMD-160和Whirlpool算法 简单的界面,与类相同,但已重命名为 与Qt 5.x一起...

    招聘(各类算法工程师).docx

    15. 哈希算法(Hashing):通过散列函数将任意大小的数据映射为固定长度的哈希值,常用于数据去重和快速查找。 16. 堆排序(Heap Sort):基于完全二叉树的排序算法,效率较高且适用于多种编程语言。 17. ...

    十大经典算法及相关论文

    论文《Hashing for Machines and Men》介绍了哈希表的基本思想和应用。 这些经典算法的论文不仅帮助我们理解算法的原理,还启发了新的算法设计和优化方法。在云计算项目中,理解和掌握这些算法可以帮助我们更好地...

    竞争性编程资料库:过去几年中使用的竞争性编程模板

    1. **哈希算法(Hashing Algorithms)**: 哈希算法在竞争性编程中用于快速查找和数据统计,例如使用线性探测、开放寻址或双哈希解决冲突来实现哈希表。它们可以用于实现快速的查找、去重和集合操作。 2. **字符串...

    招聘(各类算法工程师).pdf

    15. **哈希算法(Hashing)**:将任意长度的信息映射为固定长度的哈希值,用于数据索引、存储和验证等。 16. **堆排序(Heap Sort)**:基于比较的排序算法,构建堆然后交换堆顶元素以达到排序目的。 17. **...

    基本的算法[参考].pdf

    15. **哈希算法(Hashing)**:将任意长度的数据映射为固定长度的哈希值,用于快速查找和数据完整性验证。 16. **堆排序(Heaps)**:基于完全二叉树的排序算法,能在O(n log n)的时间内完成排序。 17. **...

    计算机科学中最重要的32个算法——转摘.docx

    10. 动态规划算法(Dynamic Programming):解决具有重叠子问题和最优子结构的优化问题,如背包问题和最长公共子序列。 11. 欧几里得算法(Euclidean algorithm):计算两个整数的最大公约数,是最古老的算法之一。...

Global site tag (gtag.js) - Google Analytics