Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 四叉树二叉搜索_C++_Algorithm - Fatal编程技术网

C++ 四叉树二叉搜索

C++ 四叉树二叉搜索,c++,algorithm,C++,Algorithm,我有一个四叉树,其中叶节点表示像素。有一种方法可以修剪四叉树,还有另一种方法可以计算如果要修剪这棵树将保留的叶子数。prune方法接受一个整数容差,该整数用作节点之间差异的限制,以检查是否进行修剪。无论如何,我想写一个函数,它接受一个参数leavesLeft。这应该做的是计算必要的最小公差,以确保修剪时,树中保留的叶数不超过leavesLeft。提示是递归地使用二进制搜索来实现这一点。我的问题是,我无法在二进制搜索和我需要编写的这个函数之间建立连接。我不确定这将如何实施。我知道允许的最大公差是2

我有一个四叉树,其中叶节点表示像素。有一种方法可以修剪四叉树,还有另一种方法可以计算如果要修剪这棵树将保留的叶子数。prune方法接受一个整数
容差
,该整数用作节点之间差异的限制,以检查是否进行修剪。无论如何,我想写一个函数,它接受一个参数
leavesLeft
。这应该做的是计算必要的最小公差,以确保修剪时,树中保留的叶数不超过
leavesLeft
。提示是递归地使用二进制搜索来实现这一点。我的问题是,我无法在二进制搜索和我需要编写的这个函数之间建立连接。我不确定这将如何实施。我知道允许的最大公差是256*256*3=196608,但除此之外,我不知道如何开始。有谁能指引我正确的方向吗?

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

  • 编写一个方法,只需尝试所有可能的公差值,并检查是否会留下足够的节点
  • 编写一个测试用例,看看它是否有效
  • 不要做第一步。在所有可能的公差值中使用二进制搜索,执行与步骤1相同的操作,但速度更快

  • 如果您不知道如何实现二进制搜索,那么最好先在简单的整数数组上尝试。无论如何,如果执行步骤1,只需存储数组中剩余的叶数(以公差作为索引)。然后对其执行二进制搜索。要将此转换为步骤3,请注意,您不需要整个阵列。只需用一个计算值的函数替换数组,就完成了。

    假设插入了公差=0。然后你会得到一个极端的答案,比如零叶剩余或所有叶剩余(不确定从你的问题看它是如何工作的)。假设插入公差=196608。你会在另一个极端得到答案。你知道你要寻找的答案就在两者之间

    因此,插入介于0和196608之间的公差数:公差为98304。如果剩下的叶子太多,那么您知道正确的公差在0到98304之间;如果太低,则正确的公差介于98304和196608之间。(或者可能是高/低部分颠倒了;从你的问题来看,我不确定。)


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

    我想应该是这样的,但是二进制搜索的细节让我有点困惑。好的,那么计算保留在maxTolerance的叶子数。如果它小于leavesLeft,那么做什么?对不起,我只是不明白这一点。如何在四叉树上进行二进制搜索?“我每次除以2的数值是多少?”iRobot表示可以找到公差的范围。