給定n個權值作為n的葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
最優二叉樹的總結點數為2n - 1。
1、路徑和路徑長度
在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l-1。
2、結點的權及帶權路徑長度
若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。
3、樹的帶權路徑長度
樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為wpl。
構造最優二叉樹的哈夫曼演算法如下:
(1)根據給定的n個權值,構成n棵二叉樹的集合t2,…, tn},其中每棵二叉樹乃中只有乙個帶權為%的根結點,其左右子樹均空。
(2)在f中選取兩棵權值最小的二叉樹作為左、右子樹構造一棵新的二叉樹,置新 構造二叉樹的根結點的權值為其左、右子樹根結點的權值之和。
(3)從f中刪除這兩棵樹,同時將新得到的二叉樹加入到f中。
(4)重複(2)、(3),直到f中只含一棵樹時為止。這棵樹便是最優二叉樹(哈夫曼樹)。
例如給定權值集合根據題中給出的權值集合,構造哈夫曼樹的過程如下圖所示。
DataStructure 8 查詢技術
8.1概述 1 查詢方式分類 靜態查詢 不涉及插入 刪除操作的查詢 動態查詢 涉及插入 刪除操作的查詢 2 查詢結構 線性表 適用於靜態查詢,主要採用順序查詢技術,折半查詢技術.樹表 適用於動態查詢,主要採用二叉排序樹查詢技術.雜湊表 靜態查詢和動態查詢均適用,主要採用雜湊技術.3 查詢演算法的效能...
data structure 之棧與佇列
問題一 用兩個佇列實現乙個棧 思路 定義兩個佇列分別為q1,q2。呼叫棧的push操作時,直接將元素push到佇列q1中,時間複雜度為o 1 呼叫棧的pop操作時,先把q1中的q1.size 1個元素push到q2中,然後再pop出q1中的最後乙個元素,再把q2中的所有元素全部push到q1中,時間...
DataStructure 排序 原始碼實現
本篇部落格實現了 1.氣泡排序 2.氣泡排序的一種優化 當某次冒泡沒有進行交換時,退出迴圈 3.選擇排序 4.歸併排序 5.快速排序。主要是原始碼的實現,並將自己在敲的過程中所遇到的一些問題記錄下來。include include include using namespace std int nu...