【发布时间】:2013-11-11 22:44:22
【问题描述】:
我正在努力了解HAMT 的详细信息。我有implemented one myself in Java 只是为了理解。我对 Tries 很熟悉,我想我掌握了 HAMT 的主要概念。
基本上,
两种类型的节点:
键/值
Key Value Node:
K key
V value
索引
Index Node:
int bitmap (32 bits)
Node[] table (max length of 32)
- 为对象生成 32 位哈希。
- 一次遍历 5 位哈希。
(0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-31)注意:最后一步(第 7 步)只有 2 位。 - 在每一步中,找到该 5 位整数在位图中的位置。例如
integer==5 bitmap==00001- 如果该位为 1,则该部分哈希存在。
- 如果该位为 0,则密钥不存在。
- 如果键存在,则通过计算位图中 0 和位置之间的 1 的数量来找到它在表中的索引。例如
integer==6 bitmap==0101010101 index==3- 如果表指向键/值节点,则比较键。
- 如果表指向一个索引节点,则前进一步进入 2。
我不太了解的部分是碰撞检测和缓解。在链接的论文中,他提到了这一点:
然后将现有密钥插入新的子哈希表中,然后 添加了新密钥。每次多使用 5 位哈希 碰撞概率降低 1/32。偶尔 可能会消耗一个完整的 32 位散列,并且必须计算一个新的散列 区分这两个键。
如果我要计算一个“新”哈希并将对象存储在该新哈希中;你怎么能在结构中查找对象?在进行查找时,它不会生成“初始”哈希而不是“重新计算的哈希”吗?
我一定是错过了什么.....
顺便说一句:HAMT 的性能相当不错,在我的测试中它位于哈希图和树图之间。
Data Structure Add time Remove time Sorted add time Sorted remove time Lookup time Size
Java's Hash Map 38.67 ms 18 ms 30 ms 15 ms 16.33 ms 8.19 MB
HAMT 68.67 ms 30 ms 57.33 ms 35.33 ms 33 ms 10.18 MB
Java's Tree Map 86.33 ms 78 ms 75 ms 39.33 ms 76 ms 8.79 MB
Java's Skip List Map 111.33 ms 106 ms 72 ms 41 ms 72.33 ms 9.19 MB
【问题讨论】:
标签: java algorithm data-structures hash trie