huffman編碼的原理:以字元的使用頻率作為權構建一棵哈夫曼樹,然後利用哈夫曼樹對字元進行編碼。構造一棵哈夫曼樹,是將所要編碼的字元作為葉子結點,該字元在檔案中的使用頻率作為葉子結點的權值,以「自底向上」的方式,通過n-1次「合併」運算後構造出的一棵樹。
核心思想:權值越大的葉子離根越遠。
貪心策略:每次從樹的集合中取出沒有雙親且權值最小的兩棵樹作為左右子樹。
先構建一棵huffman樹:(1)先找到權值最小且沒有父親的兩個結點進行合併,建立一棵樹,然後迴圈建立。
設定結構體:
typedef struct hnodetype;//節點結構體
typedef struct hcodetype; //編碼結構體
hnodetype huffnode[maxnode];
hcodetype huffcode[maxleaf];
初始化:
int x1, x2;//兩個最小權值結點在陣列中的序號
double m1, m2;//兩個最小權值結點的權值
//初始化哈夫曼陣列中的結點
for(i = 0; i <= 2*n - 1; ++ i)
//輸入n個葉子結點的名稱和權值
for(i = 0; i < n; ++i)
構造huffman樹
//構造huffman樹(核心)
for(i = 0 ; i < n-1; ++i)
else if(m2 > huffnode[j].weight && huffnode[j].parent == -1)
}//設定找到的兩個結點的父節點的資訊
huffnode[n+i].weight = m1 + m2;
huffnode[n+i].lchild = x1;
huffnode[n+i].rchild = x2;
huffnode[x1].parent = n+i;
huffnode[x2].parent = n+i;
cout << "x1.weight and x2.weight in round" << i+1 <
<< huffnode[x1].weight << "\t" << huffnode[x2].weight << endl;
}
2. 輸出哈夫曼編碼//把葉子結點的編碼資訊從臨時編碼cd複製出來,放入編碼結構體陣列
for(j = cd.start+1; j < n; ++ j)
huffcode[i].bit[j] = cd.bit[j];
huffcode[i].start = cd.start;
} }
合併後的**:#includeusing namespace std;
#define maxbit 100
#define maxvalue 10000
#define maxleaf 30
#define maxnode maxleaf*2-1
typedef struct hnodetype;//節點結構體
typedef struct hcodetype; //編碼結構體
hnodetype huffnode[maxnode];
hcodetype huffcode[maxleaf];
/* 構造哈夫曼樹:先找到權值最小且無父親的兩個節點,合併成新的節點*/
void huffmantree(hnodetype huffnode[maxnode], int n)
//輸入n個葉子結點的名稱和權值
for(i = 0; i < n; ++i)
//構造huffman樹(核心)
for(i = 0 ; i < n-1; ++i)
else if(m2 > huffnode[j].weight && huffnode[j].parent == -1)
}//設定找到的兩個結點的父節點的資訊
huffnode[n+i].weight = m1 + m2;
huffnode[n+i].lchild = x1;
huffnode[n+i].rchild = x2;
huffnode[x1].parent = n+i;
huffnode[x2].parent = n+i;
cout << "x1.weight and x2.weight in round" << i+1 <
<< huffnode[x1].weight << "\t" << huffnode[x2].weight << endl;
}
} /*哈夫曼編碼:從葉子結點開始,檢視其是否有父親結點,如果有,檢視是其父親結點的
左孩子還是右孩子,左孩子編碼為0,右孩子編碼為1*/
void huffmancode(hcodetype huffcode[maxleaf], int n)
//把葉子結點的編碼資訊從臨時編碼cd複製出來,放入編碼結構體陣列
《趣學演算法》之貪心演算法(上)
乙個貪心演算法總是做出當前最好的選擇,也就是說,它期望通過區域性最優選擇從而得到全域性最優的解決方案。演算法導論 貪心演算法秘籍 有一天,加勒比海盜們截獲了一艘裝滿古董的貨船,每件古董都價值連城,一旦打碎就失去價值。雖然海盜船足夠大,但載重量為 c,每件古董的重量為 wi 海盜們該如何把盡可能多數量...
貪心演算法 Huffman編碼
huffman編碼是資料壓縮常見的壓縮方法。即將不同概率出現的字元以不同長度的二進位制位進行編碼,概率出現的越高的字元使用長度越短的編碼,概率出現越低的字元使用長度越長的編碼。下面是對儲存字元出現概率的檔案charactorsheet.txt,每一行的左邊是字元出現的概率,單位是0.01,右邊是要編...
貪心演算法 赫夫曼編碼問題(Huffman)
赫夫曼編碼是一種廣泛用於資料壓縮的問題,該演算法的主要優勢在於節約了儲存和傳輸成本。舉乙個例子 假設要傳輸的資料為 那麼傳輸成本就是 45 3 30 3 29 3 10 3 8 3 5 3 381個字元 先合併最小頻率的2個字元對應的子樹,計算合併後的子樹的頻率 重新排序各個子樹 重複步驟1 重複步...