C++ - 区间树实现
Posted
技术标签:
【中文标题】C++ - 区间树实现【英文标题】:C++ - interval tree implementation 【发布时间】:2011-03-23 15:41:47 【问题描述】:有人知道 C++ 中有什么好的 interval tree
实现吗?
显然,模板驱动的东西,boost
-like 风格更好。
还有一个问题 - 如果有人测试过,在实践中,基于std::vector
的基本区间树实现是否可以击败通用区间树(使用 O(lg) 操作)? p>
【问题讨论】:
【参考方案1】:我也有同样的需要。我找不到任何合适的(简单的、现代的、可移植的)实现,所以我使用a python implementation by Brent Pedersen 作为指导并写了一个准系统C++ version。 IntervalTree 的行为类似于标准的 STL 容器,但由于其简单性(例如没有迭代器)有一些注意事项。你这样使用它(“T”是任意类型):
vector<Interval<T> > intervals;
// ... make intervals!
IntervalTree<T> tree(intervals);
然后你像这样查询它:
vector<Interval<T> > results;
tree.findContained(start, stop, results);
// results now contains Intervals which are fully contained in the query interval
results.clear();
tree.findOverlapping(start, stop, results);
// results now contains Intervals which overlap the query interval
【讨论】:
嗨,Erik,感谢您指出这一点。我正在查看您的代码并试图与理论联系起来(请记住我是新手。)sanityIntervals.push_back(interval(60, 80, true));
和` for (int i = 0; i (100000, 1000, 100000 + 1, true)); `。我一直在寻找带有 id、事件配对的 fork-event-join 模型。您能否详细说明您是如何得出这些数字的 - 60,80 等以及选择的布尔值对象是什么?假设我有一个分布式系统 - 一台服务器和多个客户端,我该如何利用您的代码?
不幸的是,查找函数返回内部迭代器的副本,这意味着每个查询操作都需要一个复制操作。这在大型应用程序中非常慢。虽然代码有效,但速度很慢。
@SmallChess 绝对不是。在诸如此类的非流发散函数中按值返回的全部意义在于确定 NRVO(称为返回值优化)。更不用说在某些情况下,复制省略是标准强制要求的。【参考方案2】:
类似升压? Boost ICL!
Boost Interval 容器库
【讨论】:
嗯,来自boost
的好时机。我虽然当前版本是 1.45,但我不知道我这么幸运。谢谢
@Yippie:我最近才发现它(我认为是@ybungalobill):)
如果有人知道为什么这个答案在几个月不活跃后今天收到了一个赞成票和一个反对票,我会很高兴了解它!
我投了反对票,因为问题是关于区间树的,但是这个响应只提供了一个指向 boost 中的区间容器库的链接,它没有查询树实现。 This message on the boost mailing list indicates this deficiency, but no solution has been provided as of this date.当然,看来问题作者对这个回复很满意,所以也许我只是需要一个新问题来回复:)
@Erik:感谢您的提醒!我承认我从未使用过区间树(经过操场......),我在阅读“算法简介”时自己编写了它们。需要注意的是,操作中有各种需求。【参考方案3】:
NCBI C++ Toolkit 中出现to be one。
尽管它是否“好”尚无定论(甚至它是否是模板驱动的;我对 C++ 还有些陌生,所以我不完全确定它是否是“好”,但我也很怀疑)。
【讨论】:
【参考方案4】:我上传了区间树的简单实现到github:https://github.com/coolsoftware/ITree
在 itree.h 中查找 itree 类
【讨论】:
【参考方案5】:如果您不介意将 c# 实现转换为 c++,请转到 http://code.google.com/p/intervaltree/。基于 avl 自平衡树。
【讨论】:
以上是关于C++ - 区间树实现的主要内容,如果未能解决你的问题,请参考以下文章