Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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++ 在构建kd树时对“中值”的定义感到困惑_C++_Median_Kdtree - Fatal编程技术网

C++ 在构建kd树时对“中值”的定义感到困惑

C++ 在构建kd树时对“中值”的定义感到困惑,c++,median,kdtree,C++,Median,Kdtree,我试图建立一个kd树来搜索一组点,但我对维基百科文章中“中值”的用法感到困惑。为了便于使用,wikipedia文章将kd树构造的伪代码声明为: function kdtree (list of points pointList, int depth) { if pointList is empty return nil; else { // Select axis based on depth so that axis cycles thr

我试图建立一个kd树来搜索一组点,但我对维基百科文章中“中值”的用法感到困惑。为了便于使用,wikipedia文章将kd树构造的伪代码声明为:

function kdtree (list of points pointList, int depth)
{
    if pointList is empty
        return nil;
    else
    {
        // Select axis based on depth so that axis cycles through all valid values
        var int axis := depth mod k;

        // Sort point list and choose median as pivot element
        select median by axis from pointList;

        // Create node and construct subtrees
        var tree_node node;
        node.location := median;
        node.leftChild := kdtree(points in pointList before median, depth+1);
        node.rightChild := kdtree(points in pointList after median, depth+1);
        return node;
    }
}
我对选择的中位数感到困惑。。。行,只是因为我不太确定在这里应用中值的“正确”方法是什么

据我所知,一个奇数大小的排序数字列表的中位数是中间元素aka,对于一个由5个事物组成的列表,元素编号3,或者标准的零基数组中的索引2,而偶数大小数组的中位数是两个“中间”元素的和除以两个aka,对于一个由6个事物组成的列表,中位数是元素3和4的和-或2和3的和,如果索引为零-除以2

然而,这个定义在这里肯定不起作用,因为我们使用的是一组不同的点?那么,如何为大小相等的数字列表选择正确的中位数,尤其是长度为2的列表

我感谢所有的帮助,谢谢


-Stephen

您必须选择一个轴,该轴一侧的元素数与另一侧的元素数相同。如果点的数量是奇数或点的位置不可能,只需选择一个轴来尽可能均匀地进行重新划分。

在我看来,你理解中间值的含义,但你与其他东西混淆了。你是什么意思,不同的点集

维基百科提供的代码是一个递归函数。您有一组点,因此可以创建一个根节点并选择该集的中间值。然后递归调用该函数-对于传入参数的左子树,所有点都小于原始列表的中值分割值,对于传入相等和较大点的右子树。然后为每个子树创建一个节点,其中发生相同的事情。事情是这样的:

First step (root node):
Original set: 1 2 3 4 5 6 7 8 9 10
Split value (median): 5.5

Second step - left subtree:
Set: 1 2 3 4 5
Split value (median): 3

Second step - right subtree:
Set: 6 7 8 9 10
Split value (median): 8

Third step - left subtree of left subtree:
Set: 1 2
Split value (median): 1.5

Third step - right subtree of left subtree:
Set: 3 4 5
Split value (median): 4
等等


因此,根据进入该子树的一组数字点和数据,为树中的每个节点选择中值。希望这能有所帮助。

如果我的意思不清楚,我道歉。我所说的“不同”的意思是,如果我试图用点1,1,2,2,3,3,4,4,5,5和6,6形成kd树,中位数通常是3.5,3.5。然而,3.5,3.5并不存在于我制作kd树的点中,那么会发生什么呢?从上面的例子中,我假设您实际上为树创建了一个新节点,中间节点?您在两个方面感到困惑。首先,在寻找中间值时,必须选择一个维度!所以你们例子中的中位数不能是3.5,3.5,因为这是一个二维点。相反,第一步是选择尺寸标注,比如说选择第一个尺寸标注。然后你只看所有点的第一个维度,然后计算中间值。如何选择最佳维度是另一回事。第二件事:不,不创建新节点。中位数只是一个值,而不是原始数据的一部分。将其视为树的拆分节点的属性。啊,对,好的。那恐怕我还是糊涂了,对不起=[.在第一步中,根节点,你声明中值为5.5。但是哪个节点成为根节点呢?你的左、右子树包含所有的点,所以选择哪个作为这些子树的根?我刚刚发现了一个不同的页面--这似乎意味着在kd树中,树的节点不是你想分类;这些显然存储在树叶中。这是正确的吗?我一直在错误地观察kd树?维基百科似乎暗示节点就是树中的点!如果节点位于实际点,并且你将中值定义为ap上排序的点列表中的中间项,那么一切都会简单得多适当的轴。kd树中的节点不必是您想要分类的点,如果您愿意,您当然可以在中间位置插入交叉点,但这只会创建一个节点过多的树,并且会减慢搜索速度,同时也会使查找树中的精确点变得困难,因为您必须忽略这些交叉点颂歌。