K-d樹

前言

在學習了平衡二叉查找樹、紅黑樹等等之後,今天我們再來學習一個新的數據結構——kd樹,kd樹是一種分割k維數據空間的數據結構,主要應用於多維空間關鍵數據的搜索,下面就讓我們來詳細看看這種算法。

kd樹

kd樹也是二叉樹,是用於分割多維空間的數據結構,所以其每一個節點是一個多維座標。

先來看看kd樹的構造:

在構造1維BST樹時,一個1維數據根據其與樹的根結點和中間結點進行大小比較的結果來決定是劃分到左子樹還是右子樹,同理,我們也可以按照這樣的方式,將一個K維數據與Kd-tree的根結點和中間結點進行比較,只不過不是對K維數據進行整體的比較,而是選擇某一個維度Di,然後比較兩個K維數在該維度Di上的大小關係,即每次選擇一個維度Di來對K維數據進行劃分,相當於用一個垂直於該維度Di的超平面將K維數據空間一分爲二,平面一邊的所有K維數據在Di維度上的值小於平面另一邊的所有K維數據對應維度上的值。也就是說,我們每選擇一個維度進行如上的劃分,就會將K維數據空間劃分爲兩個部分,如果我們繼續分別對這兩個子K維空間進行如上的劃分,又會得到新的子空間,對新的子空間又繼續劃分,重複以上過程直到每個子空間都不能再劃分爲止。以上就是構造Kd-Tree的過程,上述過程中涉及到兩個重要步驟:

1. 劃分時以選中維度的中位數來劃分,小的爲左節點,大的爲右節點。

2. 選擇維度的方法有最大方差法或順序遍歷法,這裏採用順序遍歷法,即對於點(x1, x2, x3, x4 ....),第一次按x1的維度來切分,第二次按照x2的維度來切分,切刀最後一個維度之後又回到x1的維度。

來看看一個二維的例子:

這是一個有13個點的二維圖

首先先以 x 座標進行切分,我們選出 x 座標的中位點,獲取最根部節點的座標(7, 2)

之後,左右兩邊再按照 y 軸的排序進行切分,中位點記載於左右枝的節點。左邊區域按(5, 4)上下分割,右邊區域按(9,6)上下分割。

在不斷按照上面的步驟進行切分和構造,得到最後結果:

k-d樹上的最鄰近查找算法

  這裏先以一個簡單的實例來描述最鄰近查找的基本思路。

  星號表示要查詢的點(2.1,3.1)。通過二叉搜索(即按照切分方法不斷尋找星號點在樹中的位置),順着搜索路徑很快就能該點的鄰近點,也就是葉子節點(2,3)。而找到的葉子節點並不一定就是最鄰近的,最鄰近肯定距離查詢點更近,應該位於以查詢點爲圓心且通過葉子節點的圓域內。爲了找到真正的最近鄰,還需要進行'回溯'操作:算法沿搜索路徑反向查找是否有距離查詢點更近的數據點。此例中先從(7,2)點開始進行二叉查找,然後到達(5,4),最後到達(2,3),此時搜索路徑中的節點爲(7,2)->(5,4)->(2,3).首先以(2,3)作爲當前最近鄰點,計算其到查詢點(2.1,3.1)的距離爲0.1414,然後回溯到其父節點(5,4),並判斷在該父節點的其他子節點空間中是否有距離查詢點更近的數據點。以(2.1,3.1)爲圓心,以0.1414爲半徑畫圓,如圖4所示。發現該圓並不和超平面y = 4交割,因此不用進入(5,4)節點右子空間中去搜索。若是該圓與y = 4有交割,則說明節點的另一半子空間中或許存在距離更小的點,所以要搜索另一半子空間。

 

  再回溯到(7,2),以(2.1,3.1)爲圓心,以0.1414爲半徑的圓更不會與x = 7超平面交割,因此不用進入(7,2)右子空間進行查找。至此,搜索路徑中的節點已經全部回溯完,結束整個搜索,返回最近鄰點(2,3),最近距離爲0.1414。

       另一個例子如查找點爲(2,4.5)。同樣先進行二叉查找,先從(7,2)查找到(5,4)節點,在進行查找時是由y = 4爲分割超平面的,由於查找點爲y值爲4.5,因此進入右子空間查找到(4,7),形成搜索路徑(7,2)->(5,4)->(4,7),取(4,7)爲當前最近鄰點,計算其與目標查找點的距離爲3.202。然後回溯到(5,4)。以(2,4.5)爲圓心,以3.041爲半徑作圓,如圖5所示。可見該圓和y = 4超平面交割,所以需要進入(5,4)左子空間進行查找。此時需將(2,3)節點加入搜索路徑中得(7,2)->(2,3)。回溯至(2,3)葉子節點,(2,3)距離(2,4.5)比(5,4)要近,所以最近鄰點更新爲(2,3),最近距離更新爲1.5。回溯至(7,2),以(2,4.5)爲圓心1.5爲半徑作圓,並不和x = 7分割超平面交割,如圖6所示。至此,搜索路徑回溯完。返回最近鄰點(2,3),最近距離1.5。

總結

kd樹是用於高維空間中的快速最近鄰和近似最近鄰查找的一種數據結構。在計算機科學裏,k-d樹( k-維的縮寫)是在k歐幾里德空間組織的數據結構。k-d樹可以使用在多種應用場合,如多維鍵值搜索(例:範圍搜尋及最鄰近搜索)。k-d樹是空間二分樹Binary space partitioning )的一種特殊情況。

 

 

最後強烈推薦Coursera上普林斯頓大學的算法課點擊打開鏈接

 

 

以上內容純屬個人學習總結,不代表任何團體或單位。若有理解不到之處請見諒!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章