##最常用來解決這個問題的是八叉樹和KD樹
但我們在講這些之前要先了解二叉樹,畢竟二叉樹是這些的基礎。
先講以下兩種方法
· K-NN
就是直接找三個最近的點,三個。
紅色的點就是我們要查找的點,綠色和藍色的點就是我們數據庫里的點,而綠色的點是我們所找到的鄰近點。
· Fixed Radius-NN
在中心點紅點以某半徑畫一個圈,在圈內的點都算鄰近點。
思考:為什么找鄰域問題很重要?
因為我們常要用到,在之前講到的法向量估計中也需要用到找鄰域,上采樣和降采樣或者噪聲去除我們都會用到NN方法。
既然重要,一定有很多開源的方法和包(PCL,flann等)。但是很遺憾,他們都不夠快。如果自己寫,大概率會比較快。
現在GPU都已經滿大街了,但是在GPU上面的最鄰近算法很少也很慢。
(GPU雲服務器是基於異構計算提供的超強的浮點計算能力服務,適用於深度學習,智能視頻分析,醫療影像分析,語音識別,高性能計算等應用場景。
用戶可根據自身需求靈活搭配。讓您即刻擁有非凡的計算能力。)
思考:為什么在點雲上的鄰域問題很困難呢?
第一個原因就是點雲不規則
第二個原因是點雲可以是三維的,三維比二維高一維,但是三維的數據點是指數上升的。用網格處理並不是很高效。
##二叉樹
用於處理一維的數據
##八叉樹
專門為了三維數據設計的
##KD樹
可以任意維度,但是常用於二維來做例子
以上三點都有一個共同的核心思想:空間分割
空間分割:
分割完以后有一些小的空間不需要去查找,那此時如何跳過這些小區域呢?
如何更快地結束搜索?
二叉樹
要滿足左邊的數字都比核心主干的數字小(在圖中的核心主干數字是8)
右邊要比中間的大
左邊和右邊又是一個小的二叉樹
在計算機科學的開端就發明了(1960)
那么如何用代碼實現二叉樹呢?
結合上上圖,每一個圈就是一個節點,每一個節點都有一個key,用來表達key的特征
左邊的節點和右邊的節點有還是無
value是別的因素,例如節點的顏色和編號
首先搞定一個問題,首先給定我們一堆的數字,也就是一維數組
怎么構建二叉樹來表達我們的信息?
現在假設我們有一個一維數組【100, 20, 500, 10, 30, 40】
首先放100
總結起來,怎么把一個數據放到二叉樹里面呢?如果被占據就跟被占據的那個數比較
轉換成代碼就是如下:
##給定一個數據點,怎么去查找這個數據點是否存在於二叉樹里面?
查找可以用遞歸或者循環
以下代碼是用遞歸查找
那么怎么用循環去實現呢?
首先要了解 堆棧 的概念,如果要避免遞歸問題,就要手動去實現一個棧。
遞歸的好處:實現起來更容易和更理解,不用手動維護查到哪里了
壞處:不停壓棧,在內存的某些地方記錄了,有多少層就要放多少層棧的信息
循環的話,用一個變量來代表我現在在什么地方。
它可以用在GPU上面。