1、統計學生學分
學生考試結果 a b c d
學分增加 5 4 3 0
人數 10 50 30 10
**1:
if a : +5
else if b : +4
else if c : +3
else d :0
這份**執行的效率為:10 + 50*2 +30*3 +10*3
**2:
if b :+4
else if c:+3
else if a: +5
else d : 0
這份**執行的效率為: 50 + 30 *2 +(10+10)*3
顯然**二比**一的效率要高
在計算機資料處理中,霍夫曼編碼使用變長編碼表對源符號(如檔案中的乙個字母)進行編碼,其中變長編碼表是通過一種評估**符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度、期望值降低,從而達到無失真壓縮資料的目的。
2.哈夫曼二叉樹
* 權值:出現次數
* 路徑:當前節點到根節點的層數
* 加權路徑:權值*路徑
* * 哈夫曼二叉樹:所有節點加權路徑和最小的二叉樹
* 根據字串構建哈夫曼二叉樹
* * 第一步:統計字串中各個字母出現次數,並且生成節點
* 第二步:根據節點的權值排序
* 第三步:取出許可權最小的兩個節點,構建乙個新節點
* 第四步:重複2 3,直到只剩乙個節點,該節點就是根節點。
**部分:
1.節點類
public
class node
public
node(object data,int weight)
public
intgetweight()
public
void
setweight(int weight)
public object getdata()
public
void
setdata(object data)
public node getleft()
public
void
setleft(node left)
public node getright()
public
void
setright(node right)
}
2.哈夫曼二叉樹類
public
class halfmentree}}
}public
void
add(string str)
}// 生成節點
for (int i = 0; i < numlist.size(); i++)
// 根據字母的權值排序從小到大(氣泡排序)
paixu();
// 排序後輸出節點的字母和權值
for (int i = 0; i < list.size(); i++)
system.out.println("********************===");
// 取出權值最小的兩個節點,構建乙個新節點
while (list.size() > 1)
// 讓根節點等於最後乙個節點
root = list.get(0);
}/**
* 遞迴遍歷
*/public
void
output()
public
void
output(node node)
}system.out.println(node.getdata() + " " + node.getweight());}}
3.測試類
public
class manage2
}
執行結果為:
二叉樹實現哈夫曼碼
最近完成乙個資料結構的作業,哈夫曼編碼,實現了 1.檢視字母的哈夫曼碼 2.哈夫曼碼轉文字 3.文字轉哈夫曼碼 這幾個功能 哈夫曼碼主要用於壓縮編碼,將字元用二進位制 0,1 編碼代替,能過使出現概率大的字母的二進位製碼短,而我們會根據字元的出現概率給各個字元賦乙個 權重 再根據權重構造乙個二叉樹 ...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
二叉樹與哈夫曼樹
1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...