Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 持久哈希表实现_Java_C++_Data Structures_Hashtable_Persistent - Fatal编程技术网

Java 持久哈希表实现

Java 持久哈希表实现,java,c++,data-structures,hashtable,persistent,Java,C++,Data Structures,Hashtable,Persistent,在我正在开发的一个程序中,我开发了一个大型的“线程树”(每个节点最多有k个子节点),其中每个线程对从其父节点继承的哈希表进行一些修改。有没有一种方法可以实现某种程度上是“持久的”(在某种意义上)的哈希表 也就是说,是否有一种方法可以实现一个键值对,其中至少有O(logn)个查找、插入和删除是完全持久的,但与普通哈希表一样“节省空间”(最坏情况)?“与普通哈希表一样节省空间”是一个相当模糊的规范,因为“普通”可能表示链接或探测,具体取决于您询问的对象。我认为还没有人设计出易于理解的持久哈希表 要获

在我正在开发的一个程序中,我开发了一个大型的“线程树”(每个节点最多有k个子节点),其中每个线程对从其父节点继承的哈希表进行一些修改。有没有一种方法可以实现某种程度上是“持久的”(在某种意义上)的哈希表

也就是说,是否有一种方法可以实现一个键值对,其中至少有O(logn)个查找、插入和删除是完全持久的,但与普通哈希表一样“节省空间”(最坏情况)?

“与普通哈希表一样节省空间”是一个相当模糊的规范,因为“普通”可能表示链接或探测,具体取决于您询问的对象。我认为还没有人设计出易于理解的持久哈希表

要获得具有所需复杂性的持久性键值映射,最简单的方法是使用持久性二进制搜索树。查找是来自短暂(非持久)BST的常见算法。但是,插入更改,并变成类似(伪Java)的内容:

//如果k的值已经在树中,则覆盖该值
节点插入(节点,键k,值v)
{
if(knode.key)
返回新节点(Node.key、Node.val、Node.left、insert(Node.right、k、v));
其他的
返回新节点(k,v,Node.left,Node.right);
}
请注意,insert例程返回一个新的树,这可能看起来效率低下,但它只更改它所遍历的节点。这是平均的O(lgn),所以它平均分配O(lgn)。这是一个非常节省空间的系统


要获得最坏情况下的O(lgn)行为,请使用红黑树。另请参阅有关函数式编程中数据结构的文献,例如Okasaki的著作。

Clojure实现了一整套持久数据结构,如哈希映射。它是开源的,所以也许你应该看看

也就是说,是否有一种方法可以实现一个键值配对,其中至少有O(logn)个查找、插入和删除是完全持久的,但与普通哈希表一样“节省空间”(最坏情况)

对。Driscoll等人的第5节展示了一种技术,该技术可以使插入、删除和查找具有O(lgn)时间和O(1)空间复杂性的完全持久的红黑树

它们的数据结构不是融合持久的。有关持久性的更多信息,请参阅

有没有一种方法可以实现一个键值配对,其中至少有O(logn)个查找、插入和删除是完全持久的,但与普通哈希表一样“节省空间”(最坏情况)

确实有。很多方面

例如,在Haskell中,简单的、大小平衡的二叉树(或有界平衡的树),如下所述:

  • 斯蒂芬·亚当斯,“有效集:平衡行为”,《函数编程杂志》3(4):553-562,1993年10月
  • J.Nievergelt和E.M.Reingold,“有界平衡的二元搜索树”,暹罗计算杂志2(1),1973年3月
提供以下API,满足您的条件:

insert :: Ord k => k -> a -> Map k a -> Map k a   -- O(log n)
lookup :: Ord k => k -> Map k a -> Maybe a        -- O(log n)
delete :: Ord k => k -> Map k a -> Map k a        -- O(log n)
在完全坚持的同时。空间使用为O(n)

要获得更好的常数因子,请尝试使用具有相同总体复杂性的数据结构

替代结构包括:

  • 由于密钥存储密集,持久性尝试比哈希表提高了空间使用率

在那篇维基百科文章中,至少有5种不同类型的持久性,你在寻找什么类型的持久性?完全持久性,刚刚更新了原始帖子如果我很了解你的问题,如果你想让每个孩子从他的父母那里继承哈希表,每次创建/添加一个孩子时,您都可以创建一个哈希表的深度副本。@Muggen:这是一个O(n)操作,适用于每次分娩。一个持久的数据结构将这个值降到O(1),以O(LG n)为代价,查找、插入和删除操作。java或C+++1是用于提到Okasaki的工作的吗?如果你能找到他的一本关于纯函数数据结构的书,你就可以找到解决这个问题的各种有趣的方法。因为插入和删除都是使用路径复制的,所以我认为每次插入都会占用Omega(lg n)空间,所以维护k个版本会占用Omega(n+k lg n)本文在理论上是可以考虑的,但是是否有一些实际的C代码实现了持久的红黑树?似乎我发现的所有库(例如GNU libavl)都不是持久性的,如果不加上持久性,理解红黑树就很难了……使用谷歌的关键词:持久的红黑driscoll
insert :: Ord k => k -> a -> Map k a -> Map k a   -- O(log n)
lookup :: Ord k => k -> Map k a -> Maybe a        -- O(log n)
delete :: Ord k => k -> Map k a -> Map k a        -- O(log n)