KD tree是一個為了組織多維數據空間分割結構體,
我現在只講一個簡單的,
如果我們有一組數據 (2,3), (5,4), (9,6), (4,7), (8,1), (7,2)
.
KD-TREE的操作
1.構建
排序第一維數據 那么就是 2,4,5,7,8,9
選取第一維的中點 7 所以第一個node 就是 (7,2)
左子樹的節點 應該是 (2,3), (5,4),(4,7)右子樹 節點應該為(9,6),(8,1)
再根據第二維排序第二層節點 左(5,4) 右(9,6)
(如果有k維 那么第1層選取第一維做分割,第二層選取第二維度做分割。。。一直到k
不過有時候可以先算一個各個維度的方差選取最大的分割,優缺點暫時還不清楚)
2.添加節點
譬如要添加(3,6)
第一層第一維是3 < 7 那么在左子樹,
第二層第二維為 6 > 4,。。。。。
和一般的排序樹一樣 不過比較時 要根據這個節點的分界維度比較,然后插入
3.最鄰近點搜索
好像很復雜的。
搜索執行下列過程
1.從根節點開始,算法遞歸的沿着樹往下執行,和插入執行相同的步驟。(根據對比當前節點的分割維度的值決定往左或往右)
2.一旦算法到達一個葉子節點保存當前節點為當前最優
3.這個算法遞歸的展開這棵樹,實行下面的步驟在每個節點上
1.如果的當前節點比當前最優更好那么當前節點變成當前最優
下面需要回溯對每個搜索路徑上的節點執行下面操作。
2.檢測分割點另一面的節點是否更好。原則上,這是通過通過畫一個超球面(圓心為搜索點,半徑為當前最優距離)是否與分割超平面相交。因為所有的超平面與軸平行。 所以就是比較當前搜索節點分割維度到當前節點的距離是否小於搜索節點到最優節點的距離。
1.如果相交那么就有比較近的節點在另一邊。所以這個算法必須到另一邊尋找最近的節點,(在另一面執行繼續搜索到葉子節點,繼續執行上面的操作)
2.如果不想交繼續當前的回溯,對搜索路徑的上級繼續執行上面操作。
4.當處理到更節點,算法完成。
本人文采不好,見諒
c語言代碼 http://code.google.com/p/kdtree/大家可以閱讀代碼 可以有更深的了解