传送门
一篇详尽易懂的大佬解说
对于上面的这个文章可以看一看它的整个系列,很详细。文章里有系列链接。
K D KD KD树学习,自闭了。
其实 K D KD KD树类似于 A ∗ A^* A∗,有一个估值函数来剪枝。它用来找出某一个点距离样本集合中最近的若干个点。(最近可以有不同的定义,比如欧几里得距离、曼哈顿距离、切比雪夫距离等)
比较严谨的实现好像是用方差什么的。这里的实现如下:
每层按照某一维从小到大排序,每深入一层就轮换一维。在这一维上,小于中位数的放到左边,大于中位数的放到右边。中位数可以用 n t h _ e l e m e n t nth \_ element nth_element求(这个函数相当于是 s o r t sort sort确定一个标准量,且不递归下去,详情百度,其复杂度为 O ( n ) O(n) O(n))
搜索距离点 Q Q Q最近的 K K K个点的大致思路:
我们用一个优先队列 L L L存储 K K K个点(见下方的③)。
首先按照二叉搜索树的方式走到叶子节点(该点很可能是距离 Q Q Q最近的一个,当然也可能不是)然后就是一个回溯递归的过程了。
在 L L L没有满的时候,首要任务就是把它填满!
而在 L L L满的时候,考虑当前节点是否可以更新 L L L(替换掉其中的最大值)。并且我们通过估值函数考虑是否向它的儿子递归下去。代码实现还是比较容易理解的。
记录一下代码实现中遇到的若干问题:
①注意建树的时候