【问题标题】:Need help figuring out C++ code segment in kd-tree implementation需要帮助找出 kd-tree 实现中的 C++ 代码段
【发布时间】:2012-01-10 08:40:52
【问题描述】:

我无法弄清楚下面的代码段在做什么。它取自 Henrik Wann Jensen 的 Realistic Image Synthesis Using Photon Mapping 一书。我认为它正在尝试做的事情(或者考虑到它在代码中的位置,我认为它应该尝试做的事情)是计算某个开始和结束索引之间的数组中的中值索引。

// inputs are an array, start and end indices that define a subset of the array
int median = 1;
while((4*median) <= (end-start+1))
  median += median;

if ((3*median) <= (end - start + 1)) {
   median += median;
   median += start - 1;
} else
  median = end - median + 1

有关更多上下文,代码来自在给定 3D 点列表的情况下构建 kd-tree 数据结构的部分。在构建 kd-tree 的每个递归步骤中,选择中点(相对于某个维度)作为新 kd-tree 的根。

我认为这段代码应该计算一些开始和结束索引之间的中值索引,但如果我是正确的,那么我无法弄清楚为什么这个中值索引以这种奇怪的方式计算。

任何帮助或见解将不胜感激,谢谢!

编辑:感谢 Vaughn Cato,我现在看到有必要以这种方式计算中位数指数。最初我很困惑为什么你不能只做 (end - start)/2 + start。这段代码的目标是获取一个点列表并将其转换为一个完整的、平衡的 kd-tree,它可以存储在一个类似堆的数据结构中(整个二叉树在一个数组中)。以幼稚的方式计算中位数索引不一定会得到一棵可以展平为数组的树。

现在我很困惑有人是如何想出这个的。任何人都可以解释或指出推导的方向吗?

【问题讨论】:

    标签: c++ median kdtree


    【解决方案1】:

    生成的中值始终是距离起点或终点的 2 次方。假设中值用于划分树,这将导致分支的大小为 2 的幂,这意味着每个节点将有两个或零个子节点。这可以提高遍历树叶的效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多