1. 程式人生 > >Huffman樹_演算法分析

Huffman樹_演算法分析

    Huffman樹定義: 對於一棵包含n個葉子結點的k叉樹, 其中第i個葉子結點的權值為w_{i}, 如果\sum_{1}^{n}w_{i}l_{i}最小, (其中l_{i}表示編號為i的葉結點到根的路徑的距離, 也即路徑上邊的數目), 則稱該樹為k叉Huffman樹.

    當(n - 1) mod (k - 1) = 0時可使用下面的貪心演算法makeHuffman, 構建二叉Huffman樹.

makeHuffman()
	設H為初始包含n個葉子結點權值的最小堆
	ans = 0
	while H.size() > 1
		a = H.top()
		b = H.top() 
		H.pop()
		H.pop() 
		ans += a + b
		建立一個新的, 權值為a + b的新的樹根p, p的兩個孩子為權值a, b對應的結點
		H.push(a + b)		

    結論1: 演算法makeHuffman結束時ans增加的值為n個葉子結點對應的二叉Huffman樹的權值, 最後一次第4至11行建立的結點p為二叉Huffman樹根節點

    引理1: n >= 2時, 設Huffman樹T的層數為L(根節點層次為0), 那麼存在T滿足: T的第L層結點個數必為偶數

    引理1證明: 假設T的第L層結點個數為奇數個, 那麼必然存在一個第L - 1層內部結點A的孩子個數為1, 設該孩子為B, 如下圖所示

                                                                                    

 

此時可將B移至A位置, 而不會使得整樹的權值變大, 因此引理1得證

    引理2: n >= 2時, 設Huffman樹T的層數為L(根節點層次為0), 那麼存在T滿足: 某個T的第L - 1層結點為T中權值最小的兩個葉結點的父節點.

    引理2證明: 對於任意不滿足某個T的第L - 1層結點為T中權值最小的兩個葉結點的父節點的T, 均可通過不增加整棵樹權值的葉結點之間的交換使得某個T的第L - 1層結點為T中權值最小的兩個葉結點的父節點, 引理2得證.

    結論1證明: 設Huffman樹中葉結點對應的集合為F = {a_{1}...a_{n}}, g.w表示結點g的權值, 當n <= 2時, 結論1顯然成立, 假設當n = k, k >= 2時結論1成立, 當n = k + 1時, 設u, v為其中權值最小的兩個葉結點, 設集合Q = F -{u, v} + {r}, 此處r.w = v.w + u.w, 設基於集合Q建立的Huffman樹的R權值為s, 則基於F建立的Huffman樹的權值為s + u.w +  v.w, 接下來證明此結論, 首先, 如果將R中的結點r使用結點u, v替換, r原來所在位置對應一個內部結點且為u和v父節點, 設經替換得到樹Y, 易知Y的權值為s + u.w + v.w, 設基於F建立的Huffman樹 f 的權值為z(根據引理2, 設f中權值最小的兩個葉結點u, v同時為某個第L - 1層內部結點的孩子結點), 顯然z >= s + u.w + v.w, 假設z < s + u.w + v.w, 考慮將 f 的結點u, v及二者父節點對應的子樹, 使用一個權值為u.v + w.v的葉結點替換, 並設替換後的二叉樹為P, 顯然P中葉結點構成的集合等於集合Q,  

且P的權值為z - u.w - v.w < s, 這與基於集合Q建立的Huffman樹的權值為s矛盾, 因此,基於F建立的Huffman樹的權值為s + u.w +  v.w. 至此較易證明結論1的正確性, 此處不再贅述餘下證明過程.

    結論2: 下面的演算法makeHuffmanK結束時ans增加的值為n個葉子結點對應的k叉Huffman樹的權值, 最後一次第7至13行建立的結點p為k叉Huffman樹根節點

makeHuffmanK()
	設H為初始包含n個葉子結點權值的最小堆
	while (H.size() - 1) mod (k - 1) != 0
		H.push(0) 
	ans = 0
	建立長度為k的陣列A[1..k] 
	while H.size() > 1
		for i = 1 to k
			A[i] = H.top()
			ans += A[i] 
			H.pop() 	
		建立一個權值為A[i] +...+ A[k]的新樹根p, p的k個孩子為權值A[1]...A[k]對應的結點
		H.push(A[i] +...+ A[k])

    引理3: n >= k且n \: mod\: (k - 1)\equiv 1時, 設Huffman樹T的層數為L(根節點層次為0), 那麼存在T滿足: T的第L層葉結點個數必為k的整數倍

    引理3證明: 當n = k時, 引理3顯然成立, 加設n = t(k - 1) + 1(t >= 1)時引理3成立, 考慮當n = (t + 1)(k - 1) + 1的情況, 此時n個葉結點對應的k叉Huffman樹T的層數L, 滿足L >= 2, 假設存在某個T中所在層數不超過L - 2的內部結點u的度小於k,此時如果將T中距離樹根最遠的葉結點移至併成為u的一個孩子, 顯然整棵樹的權值減小, 與T的最優性矛盾, 因此T中所有所在層數不超過L - 2的內部結點的度(孩子個數)均為k. 

    假設不存在Huffman樹T, 使得T的第L層葉結點個數是k的整數倍, 在不改變T的權值下, 將T的所有第L層葉結點移至T中第L層靠左的位置, 經此操作後T中第L層最右葉結點對應的父節點p, 滿足p的度為s(0 < s < k), 此時T中內部結點總數為c, 則有c - 1個內部結點度為k, 1個內部結點度為s(記該內部結點為q), 除q的s個孩子(共s個結點)之外, 餘下的所有結點除根節點外的每個節點均可由其父結點唯一的確定, 且其父結點的度均為k, 因此這部分結點總數為k(c - 1) + 1.

    根據T中結點總數可建立等式A: k(c - 1) + 1 + s = t(k - 1) + c, 也即(k - 1)(c - t) = k - s, 應有c - t = 1, k - 1 = k - s, 即c = t + 1, s = 1, 參考之前對引理1的證明過程, 此處將q用q唯一的(s = 1)個孩子替換, 那麼整棵樹的權值不會增加與假設不存在Huffman樹T, 使得T的第L層葉結點個數是k的整數倍矛盾, 因此假設不成立, 引理3得證

    引理4: n >= k且n \: mod\: (k - 1)\equiv 1時, 設Huffman樹T的層數為L(根節點層次為0), 那麼存在T滿足: 某個T的第L - 1層結點為T中權值最小的k個葉結點的父節點.

    引理4證明: 使用完全類似於引理2的證明方法即可證明引理4, 此處不再贅述證明過程.

    結論2證明: 使用完全類似於結論1的證明過程即可證明結論2, 此處不再贅述證明過程

    結論3: 演算法makeHuffman的時間複雜度為O(nlg(n)), 將k視為常數, 證明從略