当前位置: 首页 > 知识库问答 >
问题:

哈希数组映射Trie

刘京
2023-03-14

我正试图让我的头脑围绕着一个哈姆特的细节。我会用Java自己实现一个,只是为了理解。我熟悉尝试,我想我得到了HAMT的主要概念。

基本上,

两种类型的节点:

Key Value Node:
  K key
  V value
Index Node:
  int bitmap (32 bits)
  Node[] table (max length of 32)
    null
    null

我不太明白的部分是碰撞检测和缓解。在链接的论文中,他暗示了这一点:

然后将现有键插入到新的子哈希表中,并添加新键。每使用5个以上的散列比特,冲突的概率就减少1/32倍。偶尔,可能会消耗整个32位哈希,必须计算一个新的哈希来对两个密钥进行加密。

如果我要计算一个“新的”散列,并将对象存储在新的散列中;您如何能够在结构中查找对象?在进行查找时,它是否会生成“初始”哈希而不是“重新计算的哈希”。

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     

共有1个答案

严言
2023-03-14

我想你可能漏掉了这篇论文的两个部分。第一个是紧靠您引用的位之前的位:

否则密钥将与现有密钥冲突。在这种情况下,必须用子哈希表替换现有密钥,并计算现有密钥的下一个5位哈希。如果仍然存在碰撞,则重复此过程,直到没有碰撞发生。

因此,如果表中有对象A,并添加冲突的对象B,它们键冲突的单元格将是指向另一个子表(它们不冲突的地方)的指针。

接下来,您链接的论文的第3.7节描述了在运行前32位的末尾时生成新哈希的方法

哈希函数被定制为提供32位哈希。该算法要求散列可以扩展到任意位数。这是通过将键与表示trie级别的整数重新组合来实现的,零是根。因此,如果两个键确实给出了相同的初始哈希,那么重新哈希的概率为2^32中的1。

 类似资料:
  • > 阅读算法书,需要掌握哈希表的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜Java的HashMap是一个哈希表,因此我想知道HashMaps使用什么机制(链接或探测)? 我需要实现最简单的HashMap与get,put,删除。你能给我指出好的材料来阅读吗? 当用于映射的惟一键是自定义对象时,我们需要在相应的类型中实现hashCode()函数。我做得对吗?或者什么时候需要hash

  • 我想获取一个Javascript对象并将其转换为哈希数组。 以下操作仅获取对象的一个元素并将其转换为数组: 返回: 但是,当我试图创建散列元素来组成数组时,出现了一个错误: 返回: 我做错了什么?

  • 问题内容: 我有需要检查的情况。我有一个名为: 因为该键本身不存在,所以抛出。如果我检查 由于引发了另一个。如何测试地图中的键不存在?我知道该方法应该处理它,但这不在我的控制之下。] 问题答案: 即使现在我也因为.get引发异常而得到nullpoiner 如果只有一行,并且确定它抛出异常,则唯一的可能性可能是null。

  • 问题内容: Freemarker有两个集合数据类型,即列表和哈希图。有没有一种方法可以像对列表一样遍历哈希图键? 因此,如果我有一个带有数据的变量,则可以说: 我想用其值打印所有用户的属性。这是无效的,但目标很明确: 问题答案: 编辑: 不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其是不要使用。查看其他答案。 您使用内置的按键功能,例如,这应该可以工作:

  • 问题内容: 使用hashmap而不是使用对象类好吗……使用Hashmap…。 并使用对象类..... 请在应用程序运行状况,内存要求等方面告诉我… 问题答案: 这在很大程度上取决于您要实现的目标:为了提高灵活性,哈希映射会更好。但是灵活性是有代价的:哈希映射比具有相同数量的强类型字段的类还要大和慢。 哈希映射比具有相同数量字段的类具有更大的内存占用量 哈希图会强制对基元进行装箱 哈希图的创建和访问

  • 本文向大家介绍Java中并发哈希映射和同步哈希映射之间的区别,包括了Java中并发哈希映射和同步哈希映射之间的区别的使用技巧和注意事项,需要的朋友参考一下 并发Hashmap是jdk1.5中引入的类。并发哈希映射仅在添加或更新映射时在称为片段的存储桶级别应用锁。因此,并发哈希映射允许对映射进行并发读写操作。  同步hashmap(Collection.syncronizedHashMap())是C