有没有办法访问 C++ Boost rtree 中的非叶节点

Posted

技术标签:

【中文标题】有没有办法访问 C++ Boost rtree 中的非叶节点【英文标题】:Is there a way to access non leaf nodes in a C++ Boost rtree 【发布时间】:2018-06-11 09:52:00 【问题描述】:

抱歉,这是一个非常具体的问题,我无法提供任何代码,因为这是我的工作,因此保密。

我正在使用 Boost R-trees,我需要实现的算法需要访问树的非叶节点。使用 Boost rtree 库,我只能以简单的方式访问叶节点。我注意到有一个函数可以打印所有节点,包括非叶节点(这意味着它们存在,它们被计算),它们的位置,它们在树中的级别等,但我不能以与叶相同的方式访问它们节点。

目前,我最好的解决方案是实现树的访问者并重载运算符 () 以收集节点(这是 print 方法访问节点所做的事情)。

我的问题是,有人知道访问非叶节点的更简单方法吗?因为这个似乎效率不高,而且每次我想访问非叶节点时都会浪费时间。此外,我需要复制没有点的树的结构,如果我无法访问非叶节点,我就无法这样做。

提前谢谢你!

【问题讨论】:

没有人要求您透露公司代码。你应该写一个小例子来说明你的问题。在大多数情况下,我可以在几分钟内写出这样的例子。不要对质量/美丽感到害羞。这里的大多数人都渴望提供帮助。 没有访客是有福的界面。如果你需要一些“更简单”的东西 - 只需按照你喜欢的方式包装它 a minimal reproducible example 根据定义是不机密的,因为它只有证明您的问题所需的最小值。我认为您不需要包含任何机密数据来显示访问非离开节点的尝试;) 好吧,你是对的,但我真的不允许分享我在工作中编写的任何代码。这是公司政策:) 好的,所以@sehe 你说我应该提取我的节点并构建一个“自定义树”,我可以在其中访问我想要的所有内容?这是做这种事情的常用方法吗? @CsuGouv 我不明白你为什么需要存储它。我会说,如果您觉得需要,您可能需要不同的数据结构。如果 rtree 提供的访问模式不适合您的用例,那就是问题所在。 【参考方案1】:

我不知道你到底想做什么,所以这将是一个普遍的答案。

为了第一次访问树节点,您必须遍历树结构。在 Boost.Geometry 中,使用了 rtree 访问者模式。您可以手动执行此操作,但在内部使用 Boost.Variant 来表示节点,因此您最终会得到变体访问者。此时,您有几个选项,具体取决于您要对节点执行的操作。你要修改r-tree吗? rtree会在内存中移动吗?节点的地址会改变吗?你要访问多少个节点?你想存储某种对节点的引用并从那个点遍历树结构吗?你想向下还是向上遍历结构?

您注意到的一个选项是每次都遍历树结构。如果树结构可以更改,这是一个很好的方法。明显的缺点是您必须使用某种条件检查每个节点上的所有子节点(无论您做什么都是为了选择感兴趣的节点)。

如果树结构没有改变但树被复制到内存中的不同位置,您可以将节点表示为从根到感兴趣节点的路径作为子节点的索引列表。例如。 a list 1, 2, 3 含义:使用根节点的子节点1遍历树,然后在下一级选择子节点2,那么您的节点将是下一级的子节点3。在这种情况下,您仍然需要遍历树,但不必再次检查条件。

如果树没有改变并且节点保持在内存中的相同位置,您可以简单地使用指针或引用。

【讨论】:

以上是关于有没有办法访问 C++ Boost rtree 中的非叶节点的主要内容,如果未能解决你的问题,请参考以下文章

boost中rtree中的打包算法

我可以在线程中使用 Boost.Geometry.index.rtree 吗?

从 boost::geometry::index::rtree 中删除点的问题

查询与 boost::geometry::index::rtree 的交集

在将元素插入 boost::geometry::index::rtree 时获取“可索引无效”

Boost geometry rtree find iterator for the exact match of box