简易KD树(C++)

本文介绍了k-d树的基本概念,给出了C++实现简易KD树的类定义,包括树的构建、节点插入、区域查询和最近邻搜索等功能。通过比较坐标值进行节点插入和搜索,适用于空间数据库和游戏优化场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值