本文是对 Swift Algorithm Club 翻译的一篇文章。 Swift Algorithm Club是 raywenderlich.com网站出品的用Swift实现算法和数据结构的开源项目,目前在GitHub上有18000+⭐️,我初略统计了一下,大概有一百左右个的算法和数据结构,基本上常见的都包含了,是iOSer学习算法和数据结构不错的资源。 🐙andyRon/swift-algorithm-club-cn是我对Swift Algorithm Club,边学习边翻译的项目。因为能力有限,如发现错误或翻译不妥,请指正,欢迎pull request。也欢迎有兴趣、有时间的小伙伴一块儿参与翻译和学习🤓。固然也欢迎加⭐️,🤩🤩🤩🤨🤪。 本文的翻译原文和代码能够查看🐙swift-algorithm-club-cn/Octreegit
八叉树(Octree)github
八叉树是树,其中每一个内部(非叶节点)节点有八个子节点。 例如,一般用于游戏中的碰撞检测。算法
考虑如下问题:您须要在3D空间中存储多个对象(每一个对象在某个位置使用X
,Y
和Z
坐标表示)而后您须要回答哪些对象位于某个3D区域。 一个天真的解决方案是将点存储在一个数组中,而后迭代这些点并分别检查每一个点。 该解决方案花费O(n)。swift
八叉树最经常使用于经过递归地将其细分为8个区域来划分三维空间。 让咱们看看咱们如何使用八叉树来存储一些值。数组
树中的每一个节点表明一个相似盒子的区域。 叶节点在该区域中存储单个点,并为该点分配一组对象。数据结构
一旦添加了同一区域内(但在不一样点)的对象,叶节点就会变成一个内部节点,并向它添加8个子节点(叶节点)。 先前包含在节点中的全部点都将传递给其对应的子节点并进行存储。 所以,只有叶子包含实际的点和值。app
为了找到位于给定区域中的点,咱们如今能够从上到下遍历树并从节点收集合适的点。学习
在最坏的状况下,添加点和搜索仍然能够占用O(n),由于树不以任何方式平衡。 可是,平均而言,它的运行速度明显更快(与O(log n)至关)。网站
做者:Jaap Wijnen
灵感来自于Timur Galimov和苹果公司的八叉树实现
翻译:Andy Ron
校对:Andy Ron