IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Hopscotch Hashing

我思故我在 2011-07-09 22:32:03 累计浏览 3,021 次
本机暂存

    这是一种开放地址HASH,主要目的是为了提高查询速度。提高查询速度常用的思路是在插入的时候对数据作调整,让数据更紧凑。常用的方法在HASH表比较满的情况下,复杂度都很难保证。这个方法的特点是,它可以保证最坏情况下,查询的复杂度也是个常数。

    元素X算HASH后,应该存在I节点,则允许它存在【I,I+H)之间第一个空闲的节点,H一般去32,一是H比较小,用一个INT作BITMAP就可以表示它后面哪些元素是HASH到这里的。二是,H太大,跨越的CACHE行太多,性能得不到保证。

    如果【I,I+H)之间都没空闲的了,可以把【I,I+H)之间本应该HASH到I后面节点的数据往后挪。如果不管怎么挪都不行,就REHASH,把HASH表增大。

    根据这样构造出来的HASH表,查询的时候至多访问H个元素。

    插入的复杂度跟普通线性探测的HASH差不多,都是找到第一个空闲的就行了。

    难点是REHASH。如果在负载还很低的时候,就需要REHASH,那就不如用普通线性探测的HASH。论文里认为REHASH的概率,跟有H个元素HASH到同一个节点的概率是相同的,为(1/H!)。我觉得这个分析是有问题的,因为相邻的节点是互相影响的,不需要H个节点就可能无法调整了。比如I节点有H/2+1个,I+1有H/2+1个,就无法调整了。所以对这个方法的实用性表示怀疑。

同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. Memcached内存管理机制浅析 (累计阅读 5,219)
  2. PHP哈希表碰撞攻击原理 (累计阅读 5,046)
  3. redis源代码分析 - hash table (累计阅读 4,571)
  4. 思考mysql内核之初级系列7---innodb的hash表实现 (累计阅读 3,156)
  5. 浅析Linux Kernel 哈希路由表实现(二) (累计阅读 3,035)
  6. PHP中的Hash算法 (累计阅读 2,798)
  7. 用词典查找代替VLOOKUP (累计阅读 2,471)
  8. 大数据过滤及判断算法 -- Bitmap / Bloomfilter (累计阅读 2,308)
  9. 数据映射–映射概述 (累计阅读 2,209)
  10. 对象到数字 ID 的映射 (累计阅读 1,842)