FP樹爲什麼要對每個項單獨進行構造再遞歸的操作

最近在學FP樹,學了之後就有一個疑惑,發現以下一個性質

  • 一個點的父親肯定計數不小於他的兒子

然後就錯誤的感覺最後的結果是包含根的一顆樹,並且所有的頂點的計數都\ge最小支持度計數,那麼也就只需要不斷地往上刪掉葉子,並且同時清除葉子對祖先的貢獻(到一個葉子必定會經過祖先,貢獻就是葉子的計數),最後就可以得到答案,複雜度是O()O(節點數)的。

開始還以爲自己十分正確,爲什麼它還要每個項單獨做,還要遞歸那麼麻煩。看來搞ACM給我帶來了不少蜜汁自信。網上百度也沒有百度到正面回答,所以我就寫一下,也許會有跟我一樣的人吧。

最簡單的先舉一個反例,如果有兩個I5,位於不同的葉子結點,最小支持度計數是2,如果按照上述做法刪除葉子節點,I5可能就不會出現在結果裏面,同理,這樣會漏掉很多FP。換言之,最後結果並不是包含根的一顆樹。(如果你跟我這個想法一樣,你可能還會覺得最後FP樹是單個路徑的時候,所謂的“每個組合”必須要是到根的一條路徑,這個也是不對的,因爲實際上每個事務是一個集合,並沒有先後關係)

那麼算法裏面每個項單獨進行是什麼意思呢?其實是從第一項開始,逐漸構建FP,遞歸操作,其實就是在已經有的項上(可以想象爲一個虛擬集合),往後繼續加項。比如說從I5開始構建新FP樹(此時虛擬集合只有I5),遞歸下去,又對I3構建新FP樹(此時虛擬集合有I5,I3)這樣就能逐漸構造出所有的FP。

不過說實話,這個看起來是真的難寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章