Persistent Ideal Hash Tries---一种Java实现

本文介绍了作者根据Phil Bagwell的论文和Rich Hickey的讲解,用Java实现的Persistent Ideal Hash Trees。文章详细阐述了该数据结构的查找、插入、删除和修改操作,并提供了实现细节,包括常量和根节点定义、树节点结构、以及性能测试结果。
摘要由CSDN通过智能技术生成

最近看关于clojure的资料,从rich Hickey(clojure的创造者)的《Persistent Data Structure and Managed Reference》中看到了关于ideal hash trees的介绍,于是找到了Phil Bagwell关于"ideal hash trees"的论文,研究了一下,并结合rich Hickey关于Persistent Ideal Hash Trees的介绍,用Java实现了一个Persistent Ideal Hash Trees(两杯咖啡加一个下午,希望不会有太多的bug),下面就是对该数据结构的简单介绍和我的实现细节,供参考。

Ideal Hash Trees

Ideal Hash Trees可以看作是树和哈希表的组合,融合了树和哈希表的优势,当然也有缺点,但主要还是优点。
跟哈希表相比,Ideal Hash Trees在扩展和收缩上非常方便,当一个哈希表需要扩容时,通常你需要重新分配一个双倍的哈希表,然后将原来的数据re-hash到新的哈希表中,这导致了很大的代价,而Ideal Hash Trees由于是树,很容易扩展,只需要向下层扩展分支;而对于稀疏哈希表,会存在大量的空间浪费,如果你想压缩它,也需要大量的操作,但Ideal Hash Trees则只需要很小的代价,将空闲的分支节点移除就可回收空间;并且在使用哈希表时,你往往需要让占用保持在60%或者70%以下,以保持效率,但在Ideal Hash Trees中则不需要,只需要保持较少的空闲空间。因此,Ideal Hash Trees相比传统的哈希表更容易扩展和收缩,只需要较少的多余空间,具有很大的优势。
在查询效率上,哈希表的SET和GET的时间复杂度是1,一次哈希值的计算加一次比对(在存在哈希冲突的情况下,也许需要多次比对),而Ideal Hash Trees则需要更多,具有32个分支数的Ideal Hash Trees最大高度是6,但由于一个4层的Ideal Hash Trees就可以容纳上百万条数据,因此Ideal Hash Trees查询的时间复杂度通常小于6,可以认为是一个常数,和哈希表非常接近。
你可以把Ideal Hash Trees每个节点的都看成一个小规模的哈希表,当出现哈希冲突时,就向下层扩展,直到不再冲突,或者,在到达最后一层后任然存在哈希冲突(虽然我们应该尽量避免这种情况,但有时候是无法避免的),这时,我们就需要使用一些解决哈希冲突的办法,例如,使用链表。
下面是Ideal Hash Trees的一个示例(来自《Persistent Data Structure And Managed Reference》):

下面我们来看看Ideal Hash Trees的主要操作:

查找

当通过一个Key进行查找时,计算Key的哈希值keyHashValue,通常是一个32位的整数。首先,取keyHashValue开始的5位(或者你认为最有意义的5位)作为整数L1,取root的第L1个孩子,即root.children[L1],如果root.children[L1]是叶子节点,匹配则返回,否则返回失败,如果root.children[L1]是中间节点,则取keyHashValue的下5位作为整数L2,得到root.children[L1].children[L2],重复上面的步骤,依次向下,直到到达叶子节点,若匹配成功,则返回,否则返回失败。
由于Ideal Hash Trees的层次很少,最多6层,因此只需要少量的计
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值