hdu4347 The Closest M Points

本文详述了KD树的概念及其用途,它用于寻找样本集合中与特定点最近的多个点,适用于不同距离定义。文章介绍了KD树的构建过程,包括每层按维度排序并进行分割,以及使用优先队列来存储最近的K个点。在搜索过程中,当优先队列未满时填充,已满时考虑更新,并通过估值函数决定是否继续递归。在实现中要注意特定边界条件和优先队列的性质。
摘要由CSDN通过智能技术生成

传送门
一篇详尽易懂的大佬解说
对于上面的这个文章可以看一看它的整个系列,很详细。文章里有系列链接。

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(替换掉其中的最大值)。并且我们通过估值函数考虑是否向它的儿子递归下去。代码实现还是比较容易理解的。

记录一下代码实现中遇到的若干问题:
①注意建树的时候

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值