kd树的原理

  kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,可以运用在k近邻法中,实现快速k近邻搜索。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分。
   假设数据集\(T\)的大小是\(m*n\),即\(T={x_1,x_2,...x_m}\),其中\(x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T,i=1,2,...m\)。构建Kd树的过程大致如下。
  对所有的数据,以\(x^{(1)}\)为轴,即取\(x_i^{(1)},i=1,2,...m\),并求得其中位数\(mid^{(1)}\)\(mid^{(1)}\)对应的点即为根节点,以\(mid^{(1)}\)为切分点,将剩余数据分为两个集合,左子树对应小于切分点的区域,右子树对应大于切分点的区域,然后针对每个集合,以\(x^{(2)}\)为轴,重复上述过程,继续切分为两个集合,然后不断重复上述过程,依次选择\(x^{(j)},j=1,2,...,n\)为轴,直到切分得到的集合中只有一个数据为止。
   kd树的构造相对简单,那么如何利用kd树进行搜索?
  给定一个目标点,搜索其最近邻,首先按照“左小右大”的规则,找到目标点所属区域对应的叶节点,然后从该叶节点出发,依次回退到父节点,不断查找与目标点最邻近的点,当确定不可能存在更近的节点时终止,这样搜索就被限制在空间的局部区域上,效率大大提高。
  具体来说,
  (1)从根节点出发,按照“左小右大”的规则,找到目标点所属区域对应的叶节点
  (2)然后从该叶节点出发,向上回退,在回退到的每个父节点\(f\)上,执行一下两种操作:
    (a)判断\(f\)与目标点的距离是否比当前最近距离更近,如果是,则将当前最近点更新为\(f\)
    (b)当前最近点一定存在于\(f\)的一个子结点对应的区域中,即一定存在于\(f\)对应的区域中,即有可能\(f\)另一个   子结点距离目标点更近。判断目标点是否距离\(f\)另一个子结点对应区域更近,具体地,判断目标点与\(f\)对应的切  分轴 的距离是否小于当前最小距离,如果小于,从该子结点出发,重复执行步骤(2)
  (3)当回退到根节点并完成对根节点步骤(2)中的两步操作时,搜索结束。当前最近点即为目标点的最近邻点。
以一个具体例子说明。如图1是生成的一颗kd树,特征空间划分如图2所示,要求目标点S(4.5,7.5)的最近邻点。


1153897-20180209153646763-2065627668.jpg


1153897-20180209154629873-931917351.jpg


  搜索过程如下:
  (1)首先在kd树中找到了包含目标点S的叶节点D,D即为当前最近点,两点之间的距离是当前最近距离dist;
  (2)向上回退到点B,点B距离点S更远,并且点B以\(x^{(2)}=5.5\)为切分轴,S距离\(x^{(2)}=5.5\)的距离大于dist,不用考虑点F;
  (3)继续向上回退到根节点点A,点A距离点S更远,但是点A以\(x^{(1)}=5\)为切分轴,S距离\(x^{(1)}=5\)的距离小于dist,那么点S有可能距离A的右子树区域C中的点更近
  (4)从点C出发,一直访问到点E,点E比点D距离点S更近,点E成为当前最近点,两点之间的距离是当前最近距离dist;
  (5)从点E向上回退到点C,点C距离点S更远,并且点C以\(x^{(2)}=4.5\)为切分轴,S距离\(x^{(2)}=4.5\)的距离大于dist,不用考虑点G
  (6)继续向上回退,再次回退到了根节点A,结束搜索,点E即为点S的最近邻点。

转载于:https://www.cnblogs.com/bambipai/p/8435797.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应聘华为的朋友小心了,应聘华为的悲惨遭遇!

以下内容全部真实,为本人亲身经历。可随时进行当面对质。 本人女朋友,原本是西安一家企业里面的行政助理,工作比较稳定,收入不高,但也基本够她用了。 一天,我的一个同学(华为员工)说…

力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)

MySQL主从热备份工作原理简单的说:就是主服务器上执行过的sql语句会保存在binLog里面,别的从服务器把他同步过来,然后重复执行一遍,那么它们就能一直同步啦。整体上来说,复制有3个步骤:作为主服务器的Maste…

HttpClient和DefaultHttpClient

HttpClient 是接口,DefaultHttpClient是实现这个接口的子类 public interface HttpClient {/*** Obtains the parameters for this client.* These parameters will become defaults for all requests being* executed with this client, and for the parameters of…

Go语言版黑白棋

1、游戏说明2、无边框窗口实现3、背景图、最小化、关闭窗口4、界面其它设计5、黑白子提示闪烁效果6、落子7、初始化棋子、改变角色8、倒计时9、吃子10、棋子个数统计、胜负判断11、机器落子 转载于:https://www.cnblogs.com/tennysonsky/p/8442827.html

vue使用render渲染jsx

vue&jsx文档 vue实例属性 // App.ts import hBtn from ./components/hBtn import hUl from ./components/hUlexport default {data(){return {theme: "mdui-theme-pink",accent: "mdui-theme-accent-pink",users:[aoo, boo, coo]}},methods:{},render(…

java中的多线程有什么意义_Java多线程与并发面试题(小结)

1,什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一…

IT必须掌握的常用命令

一,ping      它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们…

Callable类

(一) Callable和Runnable比较相似,都可以用来实现线程任务。但callable使用了泛型设计,使用一个V类型值,能够 在执行结束后返回一个V类型的值。而Runable只会返回一个void,不能够获得执行的结果。 &#x…

Java——线程的创建,线程池

线程 多线程就是一个程序中有多个线程在同时执行。 多线程下CPU的工作原理 实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而CPU的在多个线程间切换速度…

初级第一旬05— 蓝字观试题

准提法网络佛学院 准提法教学平台 一、高七师提倡初学准提法者,应先观蓝字,在《显密圆通成佛心要集》中有依据吗? 二、正修的时候,如果不得不中断怎么办? 三、蓝字观有几种手印?可以单独使用吗?…

java并查集找朋友圈_图—并查集(解决朋友圈问题)

图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构。图可以分为两种,无向图和有向图。★图的定义:★典型问题:利用图能够解决很多问题,这里有一个较为典型的问题,假如已知有n个人和m对好友关系(存于…

技术这东西,不可不看,不可全看.

最近忙着玩开心,好久没来CSDN了,首页上有90后程序员的消息了,稍微感慨一下,曾几何时,自己这个80后还被70后的前辈所笑话,转眼就成了5年经验的老油条了.呵呵. 5年,个人认为经历还是有些代表性的,就跟刚入行或者即将入行的哥们交个底吧,这5年到底学到了什么. 如果你看完这篇文…

rand.nextint()

自从JDK最初版本发布起,我们就可以使用java.util.Random类产生随机数了。在JDK1.2中,Random类有了一个名为nextInt()的方法:public int nextInt(int n)给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即&a…

Android开发常用的插件及工具

1、GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没有墙掉为数不多的网站 2、Stack OverFlow,这个和上面一样,国外非常著名的问答网站,在上面基本上很多问题都可以得到解决 3、Genymotion模拟器,搞…

java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...

POI生成Word时,设置段落的样式String style "2"; //标题2的样式XWPFParagraph xwpfParagraph doc.insertNewParagraph(run);xwpfParagraph.setStyle(style);其实设置其他的样式都一样。例如:你想设置你的样式为“标题2”(“标题2”只是你在w…

使用python做最简单的爬虫

使用python做最简单的爬虫 --之心 #第一种方法import urllib2 #将urllib2库引用进来responseurllib2.urlopen("http://www.baidu.com") #调用库中的方法,将请求回应封装到response对象中htmlresponse.read() #调用response对象的read(&#x…

SurfaceView介绍

SurfaceView介绍 通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制)。但是在其他线程中却不能修改UI元素&…

产品与市场,究竟哪一个重要

上篇我们讲到B2C继B2B和C2C红透之后,也正在迅速的窜红。这一看法可不是我老邢杜撰,凭空想出来的,我们也可以从近期的主要媒体杂志上看到这个弥端。《二十一世纪报道》、《创业家》、《市场与营销》这些经济类杂志,均用大幅篇幅甚至…

enumerate()使用

enumerate()使用 如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写: list1 ["这", "是", "一个", "测试"] for i in range (len(list1)): print i ,list1[i] 上述方法有些累赘&#xff0…

php在window,php在window上的问题

C:/php-7/php-cgi.exe -b 127.0.0.1:9000 -c C:/php-7/php.ini用以上方式打开php的话,会自动的关闭,到处查了后说什么东西默认是500次,到了的话cgi就会关闭所以才想到用以下的批处理办法去解决echo offecho Starting PHP FastCGI...set PHP_F…