寻找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::mapstd::multimapstd::setstd::multiset

真的,我想不出比保留迭代器对的std::map 并将这些迭代器对传递给upper_bound()lower_bound() 更有效的处理方法。您希望迭代器对本身保存在映射中,以便您可以轻松地将哪些对可能在区间内归零(如果“候选区间”中的开始迭代器出现在给定区间结束之后您正在查看,然后您可以跳过检查 - 以及以后的所有 - 迭代器对)。

【讨论】:

您能否详细解释一下如何将 map/set 实现为区间树? @Kyuubi:我建议用std::map/std::set 实现一个区间树(即,以std::map/std::set 开始并以区间树结束;不是 从区间树开始,实现std::mapstd::set)。 @Kyuubi 记忆犹新,我相信这个想法只是你有(1)一个东西的集合,(2)你正在查看的那个集合中的间隔列表,(3 ) 您使用 beginend 迭代器定义了间隔。因此,使用std::map,您可以简单地将begin 迭代器作为键,并将对应的end 迭代器作为值。使用此功能,您无法一次找到所需的所有间隔,但您可以缩小需要过滤的间隔。【参考方案3】:

在this link 上还有一个区间树的 C# 实现。为有需要的人翻译成 C++ 很容易

【讨论】:

以上是关于寻找C++区间树算法实现[重复]的主要内容,如果未能解决你的问题,请参考以下文章

区间树算法,支持不重叠的区间合并

(使用线段树实现的)扫描线算法

go路由httprouter中的压缩字典树算法图解及c++实现

C++用Prim算法实现无向图最小生成树

什么是好的稳定的 C++ 树实现?

技术图文:如何利用C# 实现 Prim 最小生成树算法?