通过四叉树进行二进制搜索

时间:2011-04-03 20:33:52

标签: c++ algorithm

我有一个四叉树,其中叶节点代表像素。有一种方法可以修剪四叉树,另一种方法可以计算修剪树时剩余的叶子数。 prune方法接受整数tolerance,该整数用作节点之间差异的限制,以检查是否修剪。无论如何,我想编写一个带有一个参数leavesLeft的函数。这应该做的是计算必要的最小容差,以确保在修剪时,树中不会超过leavesLeft。提示是递归使用二进制搜索来执行此操作。我的问题是我无法在二进制搜索和我需要编写的这个函数之间建立连接。我不确定如何实施。我知道允许的最大容差是256 * 256 * 3 = 196,608,但除此之外,我不知道如何开始。任何人都可以指导我朝正确的方向发展吗?

3 个答案:

答案 0 :(得分:1)

你想要寻找尼克的空间索引四叉树和希尔伯特曲线。

答案 1 :(得分:0)

  1. 编写一种只尝试所有可能的容差值的方法,并检查是否会留下足够的节点。
  2. 编写一个测试用例,看看它是否有效。
  3. 不要执行步骤1.在所有可能的容差值中使用二进制搜索与步骤1相同,但更快。
  4. 如果您不知道如何实现二进制搜索,最好先在简单的整数数组上尝试。无论如何,如果你执行第1步,只需存储数组中留下的叶数(公差为索引)。然后对其执行二进制搜索。要将其转换为步骤3,请注意您不需要整个阵列。只需用计算值的函数替换数组即可。

答案 2 :(得分:0)

假设您插入公差= 0.然后您会得到一个极端的答案,例如零叶或剩下的所有叶子(不确定它是如何工作的)。假设您插入容差= 196,608。你会在另一个极端得到答案。你知道你正在寻找的答案介于两者之间。

所以你在0到196,608之间插入一个公差数:公差为98,304。如果剩下的叶子数太多,那么你就知道正确的公差在0到98,304之间;如果它太低,正确的公差介于98,304和196,608之间。 (或者也许高/低部分是相反的;我不确定你的问题。)

这是二元搜索。通过检查中间的值,可以将可能值的范围缩小一半。最后,你将其缩小到正确的公差。当然,您需要查找二进制搜索才能正确实现它。