寻找C++区间树算法实现[重复]
Posted
技术标签:
【中文标题】寻找C++区间树算法实现[重复]【英文标题】:Finding C++ interval tree algorithm implementation [duplicate] 【发布时间】:2010-09-17 18:55:29 【问题描述】:我正在尝试找到一种有效的 C++ 区间树实现(很可能基于红黑树),而无需病毒或限制性许可。任何指向干净的轻量级独立实现的指针?对于我想到的用例,一开始就知道间隔集(比如说一百万),我希望能够快速获得与给定间隔重叠的间隔列表。因此树一旦构建就不会改变——只需要快速查询。
【问题讨论】:
【参考方案1】:我用 C++ 编写了一个基于模板的区间树实现,https://github.com/ekg/intervaltree。麻省理工学院许可证。享受吧。
【讨论】:
【参考方案2】:C++ 标准库提供红/黑树std::map
、std::multimap
、std::set
和std::multiset
。
真的,我想不出比保留迭代器对的std::map
并将这些迭代器对传递给upper_bound()
和lower_bound()
更有效的处理方法。您希望迭代器对本身保存在映射中,以便您可以轻松地将哪些对可能在区间内归零(如果“候选区间”中的开始迭代器出现在给定区间结束之后您正在查看,然后您可以跳过检查 - 以及以后的所有 - 迭代器对)。
【讨论】:
您能否详细解释一下如何将 map/set 实现为区间树? @Kyuubi:我建议用std::map
/std::set
实现一个区间树(即,以std::map
/std::set
开始并以区间树结束;不是 从区间树开始,实现std::map
、std::set
)。
@Kyuubi 记忆犹新,我相信这个想法只是你有(1)一个东西的集合,(2)你正在查看的那个集合中的间隔列表,(3 ) 您使用 begin
和 end
迭代器定义了间隔。因此,使用std::map
,您可以简单地将begin
迭代器作为键,并将对应的end
迭代器作为值。使用此功能,您无法一次找到所需的所有间隔,但您可以缩小需要过滤的间隔。【参考方案3】:
在this link 上还有一个区间树的 C# 实现。为有需要的人翻译成 C++ 很容易
【讨论】:
以上是关于寻找C++区间树算法实现[重复]的主要内容,如果未能解决你的问题,请参考以下文章