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