本文是對 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