整数非重叠范围的数据结构?

时间:2013-10-20 03:36:47

标签: data-structures functional-programming

我记得学过一个数据结构,它将一组整数存储为树中的范围,但是已经10年了,我记不起数据结构的名称,而且我对细节有点模糊。如果它有帮助,它是CMU教授的功能数据结构,我相信2002年的15-212(编程原理)。

基本上,我想存储一组整数,其中大部分都是连续的。我希望能够有效地查询集合成员资格,有效地添加一系列整数,并有效地删除一系列整数。特别是,我关心保留原始范围。如果相邻范围合并为一个更大的范围,则会更好。

一个简单的实现是简单地使用泛型集数据结构(如HashSet或TreeSet),并在添加范围时添加范围内的所有整数,或者在删除范围时删除范围中的所有整数。但是,当然,除了添加和删除速度之外,这会浪费大量内存。

我正在考虑一个纯粹的功能数据结构,但对于我目前的使用,我不需要它。 IIRC,查找,插入和删除都是O(log N),其中N是集合中的范围数。

那么,你能告诉我我想要记住的数据结构的名称,还是一个合适的替代方案?

2 个答案:

答案 0 :(得分:7)

我发现旧的家庭作业和我想到的数据结构是Discrete Interval Encoding Trees或简称饮食。它们在Diets for Fat Sets,Martin Erwig中有详细描述。功能编程杂志,Vol。它基本上是具有不变量的间隔树,所有间隔都是非重叠且不接触的。 Hackage中有一个Haskell实现。我希望Scala能有一个现有的实现,但我没有看到任何实现。

家庭作业还包括另一种数据结构,他们称之为递归间隔 - 遮挡树(RIOT),而不是仅保留每个节点的间隔,而是保持间隔,并且从间隔中移除另一个(可能是空的)RIOT。该任务包括基准测试,显示它比随机插入和删除的饮食更好。 AFAICT它只是TA组成并且从未发布的内容,因为它似乎不再存在于互联网上的任何地方,至少不在该名称之下。

答案 1 :(得分:3)

您可能正在寻找细分树。这可能会有所帮助:http://www.topcoder.com/tc?d1=tutorials&d2=lowestCommonAncestor&module=Static

您也可以使用二进制搜索树,每个节点将有两个数据字段:min_val和max_val。

在插入算法期间,您只需要调用另一个合并操作来检查左子,父,右子创建序列,以便将它们分成单个节点。这将花费O(log n)时间。

删除和查找等其他操作将照常执行O(log n)时间,但删除时需要采取特殊措施。

相关问题