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.pswp.cn/news/453488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453488.shtml
英文地址,請注明出處:http://en.pswp.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…