k-d树介绍和类定义
k-d树( k-维树的缩写)是在k维欧几里德空间组织点的数据结构,可用在空间数据库和游戏优化等领域。具体来说,k-d树是每个节点都为k维点的二叉树。所有非叶子节点可以视作用一个超平面把空间分割成两个半空间。
下面是我按着描述粗糙写的一棵简易KD树,完成了树的创建、插入、按区域搜索、最近邻搜索等操作。本例中多维点由vector<double>类型表示,其size表示点的维数。KD树的类定义如下。
#include<iostream>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;
#ifndef KDTREE_H
#define KDTREE_H
class KDTree
{
struct KDNode
{
bool m_isLeaf;
vector<double>m_point;//k维的点
int m_split;//在第几维被分开
KDNode*m_parentNode;
KDNode*m_leftNode;
KDNode*m_rightNode;
};
private:
using st = vector<double>::size_type;
KDNode*m_root;//根节点
int m_k;//k维
int m_pointNum;//点的数量
vector<vector<double>>m_points;//点的集合
public:
//下面是给用户提供的接口
KDTree(int k, vector<vector<double>>allpoints) :m_k(k)
{
m_root = new KDNode();
m_root->m_isLeaf = false;
m_root->m_leftNode = nullptr;
m_root->m_rightNode = nullptr;
m_pointNum = allpoints.size();
m_points = allpoints;
KDTreeBuild(allpoints, m_root);
}
void Insert(vector<double>newpoint);
vector<vector<double>>SearchByRegion(vector<double>from, vector<double>to)const;
vector<double> SearchNearestNeighbor(vector<double> goalpoint);
private:
~KDTree();
void KDTreeBuild(vector<vector<double>>points, KDNode* root);
//遍历寻找一个树中与目标点最近的点
void SearchNearestByTree(vector<double>