KdTree簡介


 參考博客:https://blog.csdn.net/vinceee__/article/details/83044037

參考博客:https://blog.csdn.net/wi162yyxq/article/details/71514423

在BSTree中,節點分割的是一維數軸,那么在二維中,節點分割為平面了,就像這樣:

 

黃色的點作為根節點,上面的點歸左子樹,下面的點歸右子樹,接下來再不斷地划分,最后得到一棵樹就是的BSPTree(binary space partitioning tree). 分割的那條線叫做分割超平面(splitting hyperplane),在一維中是一個點,二維中是線,三維的是面。

 

KDTree就是超平面都垂直於軸的BSPTree。同樣的數據集,用KDTree划分之后就是這樣:

 

KdTree 是以二叉搜索樹(Binary Search Tree)為原型的用於空間檢索的數據結構,能夠在隨機分布的空間內以 O(log2N) 的時間復雜度實現對平面內點的搜索以及 O(log2N) + R 的復雜度查詢平面內任意矩形內的所有點(R為矩形內點的個數)。 KdTree的應用十分廣泛,包括且不限於范圍搜索,最鄰近點搜索,物理引擎中的碰撞檢測以及地理節點(如外賣商家)數據庫等。

原理簡介
KdTree的實現方法與BST十分相似,以最常用的二維平面的KdTree為例,其每個節點存儲一個二維的坐標點,並將平面空間以該點所在的橫線/豎線遞歸地分割成兩個子空間。
以width = 1.0, height = 1.0的單位平面為例,依次插入下列點

 

 

 

Note:

點對平面的分割方式是橫向/縱向按照層次交替出現(根節點是哪個方向都可以)。
插入節點的方法類似於BST,即從根節點開始,(設要插入的節點為Pinsert,當前遍歷的節點為Pcurrent)如果Pinsert在Pcurrent的左邊或者下邊,那么就訪問Pcurrent的left child, 反之訪問right child直到成為葉子節點。
本KdTree不支持刪除操作。

復雜度比較
KdTree在最壞情況下的復雜度與暴力求解(用集合遍歷所有元素)一樣都是O(n), 但在隨機分布的情況下可以達到O(log2N)。
以下為兩個數據結構在隨機分布的空間中的算法復雜度 (其中R表示矩形范圍內點的個數)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM