Purfer序列
我們經常干的一件事是把數變為關于圖的問題來解決,那么久了未免不會有這個疑問:能不能把圖變成數來解決問題?
所以有了這個purfer數列。
介紹一下這個數列有什么用(或者說有什么性質):
2.給定一purfer數列,可以還原出原來的無根樹,且有且僅有一種方法。
那么這個數列是怎么形成的呢?下面來大概敘述一下整個過程:
(1) 生成數列:
選取此時樹上編號最小的葉子節點,刪除此節點且將此節點所連接的節點加入數列末端
不斷的重復上述操作,直到只剩兩個節點時停止該操作。
(所以一個purfer序列的長度應為n-2)
(2)還原無根樹:
設集合A = {1,2,3,...... ,n-1, n}
設purfer數列 a1, a2, ...... , an
順次選出purfer數列首位元素,然后在集合A中選出另一元素與它相連邊
選出元素需滿足一下特點:
① 該元素此時不能在purfer序列中
② 該元素此時應在集合A中
③ 滿足以上兩條件的最小元素
不斷進行以上操作,知道purfer數列為空,此時A集合必然存在兩個元素,最后將這兩個元素連接起來,則此無根樹還原完畢。
具體樣例如下:
purfer編碼為 1 2 2
那么來思考幾個問題:
(1) 為什么此方法能夠還原?
我認為可以這樣想,首先(用上面的例子來說),你是先刪除了一個點3,然后再把這個點所連的一個點1加入purfer的。那么顯然你這個點3一定不在是、此時的purfer中,對吧?同樣的道理,無論什么時候,你purfer的首位所連接的數一定不在后面的隊列中(因為你要先刪除他,然后再把這個數所連接的數加入purfer),而由于我們每次都找的是編號最小的數,所以我們把有可能的數中找出最小數就好了,就能夠唯一確定了。而由于每個數最多只能被刪一次,所以A集合中的數用完之后就要刪去,他也只能被用一次。所以purfer中一共有n-2個數,就有n-2次操作,就連了n-2條邊。而你最后僅剩下的兩個數有且僅有一種選擇就是連最后一條邊,所以綜上就是n個點,連接n-1條邊,這必然就是一棵樹了。
(2)這樣還原的一個特殊性質:(雖然說是無根樹,我們假設它初具樹形233,就是假裝有兒子和父親節點)
有觀察可以得到,如果說一個點本來就是葉節點,那么他就悲劇了,他一來就直接被刪了,根本就沒有機會進入purfer;而如果像圖中的節點1就要稍稍幸運一些,他要在節點3被刪了以后才被刪,而節點3被刪時他就可以進入一次purfer數列;那么一個點什么時候會被刪呢? 當然是他是葉子節點的時候,也就是度為1的時候;那么怎么才能成為葉子節點?很簡單,你的周圍所連接的其他兒子點都被解決之后你就成為了葉子節點;換句話說,假設你周圍有n個兒子節點,那么你就有n次進入purfer的機會,再進一步就可以得到一個很重要的結論:一個點的度數 = 它在purfer中出現的次數 + 1(它和父節點的連邊)
轉載于:https://www.cnblogs.com/LLppdd/p/8471439.html
總結
- 上一篇: sqlmap --os-shell反制小
- 下一篇: git 命令整理