柴夥說算法(4)--再說樹
當年上大學時學的很多東西都忘記了,但是樹這個知識點卻印象深刻,因爲工作中的很多內容都可以拿樹的理論來理解和解釋。
--大學舍友
樹,數據結構中都要涉及這個概念,其中的二叉樹是主要研究內容之一。從直觀意義上來看,樹和家族裏面的宗譜相似,以前也一直是這樣來理解樹結構的。直到最近,我才從另一個角度來重新分析理解樹結構。
給定一個矩形的區域,如何將這個區域劃分爲小塊?一種自然的想法,當然是每次都把區域等分,一直等分到足夠小爲止,我們可以把它稱爲等體積的劃分法;既然有等體積的劃分法,那麼自然有非等體積的劃分法。非等體積的劃分法的一個代表性算法是kNN最近鄰算法,該算法和普通等體積算法不同的是,在每個劃分的區域上,附帶了在該區域內節點的信息,通過附帶的信息,能夠快速找到離指定節點最近的一個或者幾個節點,平均意義下,它的時間複雜度爲,這裏的是待搜尋節點的數目。值得指出的是,kNN構造的是一顆平衡二叉樹,但是在構造的每一步都需要進行排序,找到中間的那個節點,而排序算法的平均時間複雜度爲,這裏的是指該次排序涉及到的節點數目,顯然隨着構造的進行,涉及到的節點數目也隨之減少。由於涉及到排序算法,乍一看kNN最近鄰算法似乎沒有時間上的優勢,那麼,我們該在什麼時候使用kNN算法呢?
仔細分析會發現,當問題的維數比較高,比如深度學習中經常包含很多特徵,這個時候計算兩點之間的距離時,計算量是十分可觀的。而採用kNN算法,它每次只涉及一個維數上的排序,並不涉及到乘法運算,另外,當給出很多個節點,來依次尋找離它們最近的一個點或者幾個點時,kNN算法的效率是相當可觀的。另外,在搜尋最近點的過程中,算法會動態的調整距離包圍盒的大小,並可能在某一個中間步終止,搜尋的效率很高。
最後,給出我理解的最近在《統計學習方法》看到的樹的一個重要性質:完備性和互斥性。
參考資料:
[1] K nearestneighbors algorithm
https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
[2] 李航,統計學習方法,Chap5:決策樹,清華大學出版社,2012年