c++ - 在构建 kd-Tree 时对 'median' 的定义感到困惑

标签 c++ median kdtree

我试图构建一个 kd 树来搜索一组点,但我对维基百科文章中“中位数”的使用感到困惑。为了便于使用,维基百科文章将构造kd-tree的伪代码表述为:

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;
    }
}

我对“选择中位数...”行感到困惑,只是因为我不太确定此处应用中位数的“正确”方法是什么。

据我所知,奇数大小(已排序)数字列表的中位数是中间元素(又名,对于 5 个事物的列表,元素编号 3,或标准从零开始的数组中的索引 2 ),而一个偶数大小的数组的中位数是两个“中间”元素的总和除以二(又名,对于 6 个事物的列表,中位数是元素 3 和 4 的总和 - 或者 2 和 3,如果索引为零 - 除以 2.)。

但是,当我们处理一组不同的点时,这个定义肯定在这里不起作用吗?那么如何为偶数大小的数字列表(尤其是长度为 2 的列表)选择正确的中位数?

感谢所有帮助,谢谢!

-斯蒂芬

最佳答案

在我看来,您理解中位数的含义,但您对其他东西感到困惑。你是什​​么意思是不同的点集?

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

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

等等

因此,根据进入该子树的一组数字(点、数据)为树中的每个节点选择中位数。希望这会有所帮助。

关于c++ - 在构建 kd-Tree 时对 'median' 的定义感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2927165/

相关文章:

objective-c - objective-c 的四叉树或KD树?

c++ - 如何将信号附加到 qPixmap?

c++ - 将SCIP链接到现有项目

algorithm - 如何在 O(n) 时间内找到 n 个不同数字的中位数的 k 个最近邻居?

rust - 如何将数据从Array2 <f64>输入到kdtree?

algorithm - 在一组不断变化的线段中进行最近邻搜索

c++ - std::ifstream,删除函数的使用

c++ - Eclipse 强制将 -k 添加到 C++ 构建命令参数

python - 当我取数组列的中位数时,如何忽略零?

algorithm - 如何在 O(logn) 时间内找到 5 个排序列表的中位数?