kd樹(k-dimension tree)是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。kd樹是是一種二叉樹,表示對k維空間的乙個劃分,構造kd樹相當於不斷地用垂直於座標軸的超平面將k維空間切分,構成一系列的k維超矩形區域。kd樹的每個結點對應於乙個k維超矩形區域。利用kd樹可以省去對大部分資料點的搜尋,從而減少搜尋的計算量。
#pragma once
#include
#include
#include
#include
using
namespace
std;
int dimused;
// kd樹的節點定義
struct kdnode
};// 用於以第n位進行比較,方便過載
bool cmp(vector
a, vector
b)ostream & operator
<<(ostream & os, vector
vi)
// 匯入資料,第一行是資料數量和維度,後面跟著num行dim維度的資料,每個一行
bool loaddata(string filename, vector
> &data)
return
true;
}return
false;
}// 計算n維向量距離
int disvector(vector
a, vector
b)// kd 樹的類
class kdtree
void createtree()
// create kd tree struct
kdnode * createtreenode(int left, int right,int dim)
void printkdtree()
void printkdtreenode(kdnode * r)
// 查詢kd樹
kdnode * searchkdtree(vector
d)// 找到屬於的那個節點
mindis = min(disvector(d, tmp->val),mindis);
kdnode * nearnode = tmp;
cout
<< endl<<"nearest node: "
// 退回到根節點
while (tmp->parent != null)
cout
<< "now parent node: "
<< tmp->val << endl;
kdnode * son;
// 判斷當前軸與點的距離,如果小於mindis,則進行到另一半進行查詢
if (abs(tmp->val[tmp->axis] - d[tmp->axis]) < mindis)
}
// 對根節點的另外半邊子樹進行搜尋
/*if (abs(tmp->val[tmp->axis] - d[tmp->axis]) < mindis)
*/return nearnode;
}// 查詢當前節點下的最近點
void searchkdtreenode(vector
d,int &mindis,kdnode * &nearnode,kdnode * tmp)
// 如果軸與節點的距離小於mindis,則兩個半邊都需要搜尋,否則只需要搜尋乙個半邊
if (abs(tmp->val[tmp->axis] - d[tmp->axis]) < mindis)
else
}};// 測試kd樹
void testkdtree()
/*測試資料
6 22 3
5 49 6
4 78 1
7 2*/
github位址
如有錯誤,歡迎指出~
KNN演算法的KD樹C 實現
kd樹本質上是一種二叉樹,它擁有具備特定排列順序的 節點以便查詢資料,即在二叉排序樹之中,某個 節點左子樹的值均小於 節點的值,而右側均大於 節點的值,如果用中序遍歷這棵樹,它的列印順序將是從小到大遞增的順序。當然剩下的科普就不說了,這也是在pcl庫當中,最常用的輪子之一,處理點雲速度非常快。另外,...
KNN的實現 KD樹
實現knn時,主要考慮的問題是如何對訓練資料進行快速近鄰搜尋.這點在特徵空間的維數大及訓練資料容量大時尤其必要.knn最簡單的實現方法是線性掃瞄 linear scan 這時要計算輸入例項與每乙個訓練例項的距離.當訓練集很大時,計算非常耗時,這種方法是不可行的.為了提高knn搜尋的效率,可以考慮使用...
KD樹 BBF KNN使用C 實現(2)
在上一節中我們講解了kd的構造過程,這裡我們主要講解的kd的搜尋過程,如何查詢距離目標點最近的點。我們先把kd樹的最鄰近搜尋 knn 的 貼上出來 private node kdtreefindnearest node tree,train target else searchnode search...