【问题标题】:Range search in quadtree efficiency四叉树效率中的范围搜索
【发布时间】:2014-08-07 16:55:32
【问题描述】:

我在 C 中实现了点四叉树和该树的范围搜索。我的范围搜索返回正确的结果,但是当我通过 valgrind 运行它时,valgrind 被杀死。我正在使用递归方法。我想让我的范围搜索更高效,但我的大部分尝试似乎都过于复杂。

int qt_rangesearch(qt_node* root, double x, double y, double d){
  qt_node* temp = root;
  int count = 0;
  if (root == NULL){ return 0; }
  if (dist2(temp->x, temp->y, x, y) <= (d*d)){
    count = 1;
  }
  return (count + 
          qt_rangesearch(temp->ne, x, y, d) + 
          qt_rangesearch(temp->nw, x, y, d) + 
          qt_rangesearch(temp->se, x, y, d) + 
          qt_rangesearch(temp->sw, x, y, d) );
}

这是我的简单方法,速度慢但会杀死 Valgrind。我如何使它更有效率?我假设如果点 x,y 到当前节点的 SW 并且当前节点距离 x,y 比不继续范围搜索到当前节点的 NE 更远,那么我假设某些东西。

编辑:

我的距离函数:

double dist2(double x1, double y1, double x2, double y2) {
    return (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2);
}

【问题讨论】:

  • 为什么分配给temp而不是直接使用rootdist2 长什么样子?
  • 我应该使用 root,但习惯于在每个函数中创建一个临时指针。虽然应该有相同的结果
  • 您需要澄清“valgrind 被杀死”是什么意思。从字面上看,它就像说“它不起作用”一样没有信息。提供来自 valgrind 的日志信息报告以及您的问题以及相关来源。

标签: c algorithm tree computer-science quadtree


【解决方案1】:

你似乎总是递归到节点的每个子节点,所以你总是访问四叉树的每个节点。如果由于某种原因您总是必须访问每个节点,为什么还要使用四叉树呢?为什么不只保留一个节点向量?

通常四叉树会得到回报,因为您可以计算出您不需要通过一些孩子向下递归。无论是从构建四叉树的方式还是通过在每个节点上保存某种簿记信息,您都会知道,例如该节点下方的所有内容都在它的距离 D 内,并且您可以由此得出在给定子节点下方没有您感兴趣的节点,因此您不需要向下递归它。

排除节点的一​​种方法是为该节点下方的所有内容保留一个边界框,并计算出该边界框中的所有内容至少距离查询点 d。

另一种方法是将三角不等式 d(a, c) = |d(a, c) - d (b, c)| (您可能还需要假设 d(x, y) = d(y, x))并使用它来计算给定节点下的所有内容都必须 >= d 从查询点开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多