【问题标题】:Finding C++ interval tree algorithm implementation [duplicate]寻找C++区间树算法实现[重复]
【发布时间】:2010-09-17 18:55:29
【问题描述】:

我正在尝试找到一种有效的 C++ 区间树实现(很可能基于红黑树),而无需病毒或限制性许可。任何指向干净的轻量级独立实现的指针?对于我想到的用例,一开始就知道间隔集(比如说一百万),我希望能够快速获得与给定间隔重叠的间隔列表。因此树一旦构建就不会改变——只需要快速查询。

【问题讨论】:

    标签: c++ algorithm red-black-tree interval-tree


    【解决方案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++ 很容易

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多