kd-樹 其實是k-dimension tree的縮寫,是對資料點在k維空間中劃分的一種資料結構。其實,kd-樹是一種平衡二叉樹。
舉一示例:
假設有六個二維資料點 = ,資料點位於二維空間中。為了能有效的找到最近鄰,kd-樹採用分而治之的思想,即將整個空間劃分為幾個小部分。六個二維資料點生成的kd-樹的圖為:
對於擁有n個已知點的kd-tree,其複雜度如下:
構建:o(log2n)
插入:o(log n)
刪除:o(log n)
查詢:o(n1-1/k+m) m---每次要搜尋的最近點個數
一 kd-樹的構建
kd-樹是乙個二叉樹,每個節點表示的是乙個空間範圍。下表表示的是kd-樹中每個節點中主要包含的資料結構。range域表示的是節點包含的空間範圍。node-data域就是資料集中的某乙個n維資料點。分割超面是通過資料點node-data並垂直於軸split的平面,分割超面將整個空間分割成兩個子空間。令split域的值為i,如果空間range中某個資料點的第i維資料小於node-data[i],那麼,它就屬於該節點空間的左子空間,否則就屬於右子空間。left,right域分別表示由左子空間和右子空間空的資料點構成的kd-樹。
網域名稱 資料型別 描述
node-data
資料向量
資料集中某個資料點,是n維向量
range
空間向量
該節點所代表的空間範圍
split 整數
垂直於分割超面的方向軸序號
left
kd-tree
由位於該節點分割超面左子空間內所有資料點構成的kd-樹
right
kd-tree
由位於該節點分割超面左子空間內所有資料點構成的kd-樹
parent
kd-tree
父節點
構建kd-樹的偽碼為:
演算法:構建kd-tree
輸入:資料點集data_set,和其所在的空間。
輸出:kd,型別為kd-tree
1 if data-set is null ,return 空的kd-tree
2 呼叫節點生成程式
(1)確定split域:對於所有描述子資料(特徵向量),統計他們在每個維度上的資料方差,挑選出方差中最大值,對應的維就是split域的值。資料方差大說明沿該座標軸方向上資料點分散的比較開。這個方向上,進行資料分割可以獲得最好的解析度。
(2)確定node-data域,資料點集data-set按照第split維的值排序,位於正中間的那個資料點 被選為node-data,data-set` =data-set\node-data
3 dataleft =
left-range =
dataright =
right-range =
4 :left =由(dataleft,leftrange)建立的kd-tree
設定:left的parent域(父節點)為kd
:right =由(dataright,rightrange)建立的kd-tree
設定:right的parent域為kd。
如上例中,
(1)確定:split 域=x,6個資料點在x,y 維度上的資料方差為39,28.63.在x軸方向上的方差大,所以split域值為x。
(2)確定:node-data=(7,2),根據x維上的值將資料排序,6個資料的中值為7,所以node-data域為資料點(7,2)。這樣該節點的分割超面就是通過(7,2)並垂直於:split=x軸的直線x=7.
(3)左子空間和右子空間,分割超面x=7將整個空間分為兩部分。x<=7 為左子空間,包含節點(2,3),(5,4),(4,7),另一部分為右子空間。包含節點(9,6),(8,1)
這個構建過程是乙個遞迴過程。重複上述過程,直至只包含乙個節點。
KD樹核心思想簡介
kd 樹 其實是k dimension tree的縮寫,是對資料點在k維空間中劃分的一種資料結構。其實,kd 樹是一種平衡二叉樹。舉一示例 假設有六個二維資料點 資料點位於二維空間中。為了能有效的找到最近鄰,kd 樹採用分而治之的思想,即將整個空間劃分為幾個小部分。六個二維資料點生成的kd 樹的圖為...
MapReduce核心思想
mapreduce核心程式設計思想,如圖1 1所示。圖1 1 mapreduce核心程式設計思想 1 分布式的運算程式往往需要分成至少 2個階段。2 第乙個階段的 maptask 併發例項,完全並行執行,互不相干。3 第二個階段的 reducetask 併發例項互不相干,但是他們的資料依賴於上乙個階...
Kafka核心思想
kafka是2010年12月份開源的專案,採用scala語言編寫,使用了多種效率優化機制,整體架構比較新穎 push pull 更適合異構集群。設計目標 1 資料在磁碟上的訪問代價為o 1 2 高吞吐率,在普通的伺服器上每秒也能處理幾十萬條訊息 3 分布式架構,能夠對訊息分割槽 4 支援將資料並行的...