KD樹的C 實現

2021-08-09 01:17:57 字數 1967 閱讀 2890

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...