A. 關於遞歸演算法求二叉樹深度演算法
u,v 分別求出當前節點左子樹和右子樹的深度(高度),
然後當前節點的 深度就等於左右子樹裡面較大的那個+1.
if (u>n) return (u+1)
return (v+1)
這句就是返回較深的+1.
u=height(T->lchild);
v=height(T->rchild);
這兩句就是遞歸的調用,求深度了。
if (T==NULL) return 0;
這個就是終止條件了,如果沒有子節點就返回。
B. 孤立森林(Isolation Forest)演算法簡介
孤立森林演算法是一種適用於連續數據的無監督異常檢測方法,由南京大學周志華教授等人於2008年首次提出,之後又於2012年提出了改進版本。與其他異常檢測演算法通過距離,密度等量化指標來刻畫樣本間的疏離程度不同,孤立森林演算法通過對樣本點的孤立來檢測異常值。具體來說,該演算法利用一種名為孤立樹 的二叉搜索樹結構來孤立樣本。由於異常值的數量較少且與大部分樣本的疏離性,因此,異常值會被更早的孤立出來,也即異常值會距離 的根節點更近,而正常值則會距離根節點有更遠的距離。此外,相較於LOF,K-means等傳統演算法,孤立森林演算法對高緯數據有較好的魯棒性。
我們先給出孤立樹(Isolation Tree)和樣本點 在孤立樹中的路徑長度 的定義
孤立樹 :若 為孤立樹的一個節點, 存在兩種情況:沒有子節點的外部節點,有兩個子節點 和一個test的內部節點。在 的test由一個屬性 和一個分割點 組成, 的點屬於 ,反之屬於 。
樣本點 在孤立樹中的路徑長度 :樣本點 從 的根節點到葉子節點經過的邊的數量
從下圖我們可以直觀的看到,相對更異常的 只需要4次切割就從整體中被分離出來,而更加正常的 點經過了11次分割才從整體中分離出來。這也體現了孤立森林演算法的基本思想。(ps:圖片來自原論文)
下面,我們來詳細介紹孤立森林演算法。該演算法大致可以分為兩個階段,第一個階段我們需要訓練出 顆孤立樹,組成孤立森林。隨後我們將每個樣本點帶入森林中的每棵孤立樹,計算平均高度,之後再計算每個樣本點的異常值分數。
Step1: 為給定數據集, ,從 中隨機抽取 個樣本點構成 的子集 放入根節點。
Step2:從 個維度中隨機指定一個維度 ,在當前數據中隨機產生一個切割點 , 。
Step3:此切割點 生成了一個超平面,將當前數據空間劃分為兩個子空間:指定維度小於p的樣本點放入左子節點,大於或等於p的放入右子節點。
Step4:遞歸Step2和Step3,直至所有的葉子節點都只有一個樣本點或者孤立樹 已經達到指定的高度。
Step5:循環Step1至Step4,直至生成 個孤立樹
第二階段:
Step1: 對於每一個數據點 ,令其遍歷每一顆孤立樹 ,計算點 在森林中的平均高度 ,對所有點的平均高度做歸一化處理。異常值分數的計算公式如下所示:
其中,
參考: https://dl.acm.org/citation.cfm?doid=2133360.2133363
C. c語言數據結構求森林的深度的遞歸演算法
d1代表,如果不是這個第一個左孩子不是空樹,它就會一直找下去,直到找到最後,記下左孩子的深度
d2代表,如果不是這個第一個右孩子不是空樹,它就會一直找下去,直到找到最後,記下右孩子的深度
當然每次都會返回的左右深度的最大值,因為你要找的是森林的深度。
如果你不明白的話,你可以看一個比較簡單的,就是求樹的深度,再簡單的就是求二叉樹的深度,當這些深度你都會求了,森林的自然而然就會了。呵呵呵
不知道對你有沒有幫助啊