高级数据结构——KD树(K-Dimension Tree)

引子

在一张地图上,有10w个单位,每个单位之间都需要独立寻路,检测碰撞和寻找最近的敌方目标。当这一切需要在手机上流畅运行并尽可能快的在服务器进行模拟时,最简单的平方算法已经不能满足需求。

怎样减少计算的复杂度呢?

通过观察,可以发现,在地图左上角的单位根本无需和地图右下角的单位进行碰撞检测,因为它们离的太远了。
所以,通过对战场进行空间划分,可以避免大量的无效计算。
一种简单的划分方法是,将战场沿着横纵坐标划分为的格子,只对在相同格子内的战斗单元做碰撞检测。此时我们引入KD树。
KD树(k-dimensional tree),也可称之为K维树,可以用更高的效率来对空间进行划分,并且其结构非常适合寻找最近邻居和碰撞检测。

何为KD树

Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z…))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种平衡二叉树。所以它的增加,删除,查询时间复杂度都是logn

首先必须搞清楚的是,k-d树是一种空间划分树,说白了,就是把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作。想像一个三维(多维有点为难你的想象力了)空间,kd树按照一定的划分规则把这个三维空间划分了多个空间,如下图所示:
在这里插入图片描述
再举一个简单直观的实例来介绍k-d树构建算法。假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内,如下图所示。为了能有效的找到最近邻,k-d树采用分而治之的思想,即将整个空间划分为几个小部分,首先,粗黑线将空间一分为二,然后在两个子空间中,细黑直线又将整个空间划分为四部分,最后虚黑直线将这四部分进一步划分。
在这里插入图片描述

发布了175 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43461641/article/details/102978815
今日推荐