KD樹核心思想簡介

2021-06-09 14:02:03 字數 1950 閱讀 6833

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 支援將資料並行的...