首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

八叉树Octree、KD树数据结构详细解读

  • 25-03-07 21:02
  • 3651
  • 12316
blog.csdn.net

一、八叉树 (Octree)

八叉树 (Octree) 是一种 递归分区数据结构,用于在 三维空间 中高效地管理和检索空间数据。它是四叉树 (Quad Tree) 的三维扩展,用于将空间递归划分为更小的立方体区域。八叉树广泛应用于 计算机图形学、碰撞检测、三维游戏引擎、地理信息系统 (GIS)、3D 渲染 及 体积数据表示 等领域。

1. 结构与特点
  • 节点结构:
    • 每个节点最多有 8 个子节点,每个子节点对应一个八分空间(子立方体)。
    • 根节点表示整个三维空间,每次分割时,将其划分为 8 个等大小的立方体区域。
  • 层次结构:
    • 树的根节点表示整个三维空间范围。
    • 每次分裂将空间递归划分成更小的立方体,直到满足一定的分辨率或存储限制。
  • 树的深度:
    • 八叉树的深度取决于数据密度和预设的最大深度。
    • 节点可以是 内部节点(存储子节点的指针)或 叶子节点(直接存储数据点)。
2. 核心操作
  • 插入 (Insert):
    • 从根节点开始,根据数据点的坐标递归选择适当的八分空间进行插入。
    • 若叶子节点超出容量限制,则对该节点进行 分裂 (Split),重新分配其数据点到新创建的子节点。
  • 查询 (Search):
    • 区域查询 (Range Query):根据查询立方体区域递归搜索与之相交的子节点。
    • 邻近查询 (Nearest Neighbor Query):基于点的空间位置搜索最近的邻近点。
  • 删除 (Delete):
    • 定位到存储数据的叶子节点,将其删除。
    • 删除后若节点变为空,则可选择将其父节点的 8 个子节点合并为一个节点(可选的压缩操作)。
3. 优缺点
优点缺点
能有效管理稀疏的三维空间数据对数据分布敏感,可能导致不平衡的树结构
适合快速的三维空间查询、碰撞检测、可见性裁剪树的深度会随着数据密度增加而急剧增加
支持动态插入和删除分裂和合并操作频繁时,性能可能受影响
4. 应用场景
  • 计算机图形学:三维场景中的光线追踪 (Ray Tracing)、遮挡剔除 (Occlusion Culling)。
  • 游戏开发:用于 3D 空间的碰撞检测、物理引擎。
  • 地理信息系统 (GIS):三维地形建模、体积数据存储与分析。
  • 机器人导航:用于环境感知、路径规划。

二、KD 树 (K-Dimensional Tree, KD-Tree)

KD 树 (KD-Tree) 是一种 空间划分数据结构,专门用于在 k 维空间 中高效地处理 点数据。KD 树的设计初衷是为了支持 快速的最近邻搜索 和 区域查询,广泛应用于 机器学习(如 KNN 分类器)、计算机视觉、推荐系统 和 数据库 中。

1. 结构与特点
  • 节点结构:
    • 每个节点存储一个 k 维数据点及其左右子树的指针。
    • 每一层根据某个维度的坐标值对数据点进行划分,该维度依次轮换。
  • 划分规则:
    • 分割维度:依次轮换选择第 0 维、第 1 维、…、第 (k-1) 维作为分割依据。
    • 分割值:通常选取中位数,以保证树的平衡性。
  • 树的深度:
    • 树的深度为 O(log⁡n),若数据点分布均匀,则树的高度较为平衡。
2. 核心操作
  • 构建 (Build):
    • 对数据集进行递归划分,依次轮换各个维度,选取中位数作为节点,构建平衡 KD 树。
    • 时间复杂度为 O(nlog⁡n)。
  • 插入 (Insert):
    • 类似二叉搜索树,根据节点的分割维度递归插入数据点。
    • 可能导致树的不平衡,因此通常不适合频繁插入的动态场景。
  • 查询 (Search):
    • 区域查询 (Range Query):在各个维度上递归比较搜索区域与节点划分平面的位置关系。
    • 最近邻查询 (Nearest Neighbor Search):
      1. 递归搜索点所在的叶子节点,标记当前最近邻。
      2. 回溯时检查分割超平面另一侧的子树是否可能包含更近的点。
  • 删除 (Delete):
    • 递归查找到目标点,若目标点存在子树,则选择替代节点(如最小节点)替换,并调整树结构。
3. 时间复杂度
操作平均情况复杂度最坏情况复杂度
构建 (Build)O(nlog⁡n)O(nlog⁡n)
插入 (Insert)O(log⁡n)O(n)
删除 (Delete)O(log⁡n)O(n)
查找 (Search)O(log⁡n)O(n)
最近邻查询 (Nearest Neighbor)O(log⁡n)O(n)
4. 优缺点
优点缺点
支持快速的 k 维空间点查询数据维度增加时,性能显著下降(维度灾难)
适合于静态数据集的最近邻和范围查询动态插入和删除操作性能较差
构建简单、查询高效对数据分布和查询模式敏感
5. 应用场景
  • 机器学习:KNN (K-Nearest Neighbors) 分类器。
  • 计算机视觉:图像检索、目标检测。
  • 推荐系统:相似度查询、内容推荐。
  • 地理信息系统 (GIS):地理位置查找、空间分析。
  • 机器人导航:路径规划、障碍物检测。

三、Octree vs KD-Tree

特性八叉树 (Octree)KD 树 (KD-Tree)
数据类型三维空间中的立方体或体积数据k 维空间中的点数据
划分维度三维空间均分为 8 个子立方体逐维划分,分割维度轮流选择
适用场景3D 渲染、碰撞检测、三维场景管理最近邻搜索、机器学习、数据挖掘
插入性能对稀疏数据表现良好对静态数据集性能优越
查询效率适合快速的空间区域查询适合高效的 k 维空间点查询
扩展性支持动态插入和删除操作对动态数据集不够友好

总结

  • 八叉树 (Octree) 更适合用于 三维空间 的体积数据管理,尤其在需要高效的 碰撞检测、光线追踪 和 遮挡剔除 场景下表现出色。
  • KD 树 (KD-Tree) 则更适合处理 高维点数据 的搜索与查询问题,如最近邻搜索和区域查询,是机器学习与数据挖掘中的重要工具。
注:本文转载自blog.csdn.net的Katie。的文章"https://blog.csdn.net/m0_61840987/article/details/143624760"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

113
数据结构与算法
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top