#include #include #include #include using namespace std;
vectorv;
struct node
};class op
};priority_queue, op> q;
int dfs(node* p, int level)
void destroy(node* p)
int main() ;
// 字符集
string st = " abcdefghijklmnopqrstuvwxyz";
// 頻度
int f = ;
// 總頻數
int all = 0;
for(int i = 0; i < st.size(); ++i)
// 生成基礎節點
for(int i = 1; i < 128; ++i)
if(c[i]) q.push(new node(c[i]));
// 替換指標,擷取節點
node *x, *y, *z;
// 優先佇列合併
while(!q.empty())
int p = dfs(x, 0), q = 8 * all;
if(x->left == null && x->right == null) p = x -> len;
destroy(x);
printf("%d %d %.1lf\n", q, p, double(q)/p);
system("pause");
}
貪心 哈夫曼編碼 哈夫曼樹
解決問題 哈夫曼樹 眾所周知,計算機以01串來儲存和運算。所以,如果我們想要存乙個字元或漢字,例如a,計算機會將它變為乙個01串,這個串就是a的編碼。如果我們輸入了乙個詞 cat。如果a的編碼是1,c的編碼是10,t的編碼是11,那麼 cat 對應的編碼就是 10111 好了,那麼問題來了 1011...
貪心 哈夫曼編碼
哈夫曼編碼 所謂編碼就是對於任意給定的文字,通過查閱編碼表逐一將其中的字元轉譯為二進位制編碼,這些編碼依次串接起來即得到了全文的編碼。編碼方案確定後,儘管編碼結果必然確定,但解碼過程和結果卻不見得唯一。例如,字元a的編碼為01,b的編碼為011,c的編碼為11,d的編碼為101。當給定一串字元011...
哈夫曼編碼(貪心)
題目描述 給定乙隻含有小寫字母的字串 輸出其哈夫曼編碼的長度 輸入第一行乙個整數t,代表樣例的個數,接下來t行,每行乙個字串,0輸出 對於每個字串,輸出其哈夫曼編碼長度 樣例輸入 3hrvsh lcxea dphiopd mntflolfbtbpplahqolqykrqdnwdoq 樣例輸出 105...