資料結構 霍夫曼(哈夫曼)編碼(C語言)

2021-10-12 03:15:04 字數 1883 閱讀 5021

目錄

目的:編碼過程:

圖示過程說明:

整體**:

相關小知識點:

執行結果:

掌握霍夫曼樹的生成演算法

熟練掌握霍夫曼編碼的方法

a.首先輸入n個待編碼的字元data及其權值weight,並將n個字元的權值放入到霍夫曼樹的節點中。

b.用select函式遍歷n個字元,找出權值最小的兩個s1和s2,構造乙個新的節點hi,將s1和s2連線到hi的lchild和rchild節點上, hi節點的weight為s1和s2的weight之和。

c.將新建立的節點hi替換s1和s2,繼續步驟b(這時的字元數為n-i,i=1,2,…),直到只剩下乙個節點為止。至此,霍夫曼樹構造完成。

d.給霍夫曼樹ht分配編碼,並輸出。

#include#include#includetypedef structhtnode,*huffmantree;  //動態分配陣列儲存霍夫曼樹

typedef char* *huffmancode;//動態分配陣列儲存霍夫曼編碼

//選擇出最小的兩個結點

void select(huffmantree &ht,int k,int &s1,int &s2)

for(;i<=m;++i,++p) //對另外n-1個葉子結點賦初值

for(i=n+1;i<=m;i++)

//從葉子到根逆向求每個字元的霍夫曼編碼

hc=(huffmancode)malloc((n+1)*sizeof(char*)); //分配n個字元編碼的頭指標變數

cd=(char*)malloc(n*sizeof(char)); //分配求編碼的工作空間

cd[n-1]='\0';//編碼結束符

for(i=1;i<=n;i++) //逐個字元求霍夫曼編碼

hc[i]=(char*)malloc((n-start)*sizeof(char)); //為第i個字元編碼分配空間

strcpy(hc[i],&cd[start]);//從cd複製編碼到hc

}free(cd); //釋放工作空間

}void main()

huffmancoding(ht,hc,w,n);

for(i=1;i<=n;i++)

printf("%c:%s\n",ch[i],hc[i]);

}

char* *huffmancode 等價於 char* huffmancode;

strcpy(s1,s2); strcpy函式的意思是:把字串s2拷貝到s1中,連同字串結束標誌也一同拷貝。如果s2="china",那麼s1中存放的是china\0。

學生黨,有什麼不對的地方請大佬們指出!

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...

資料結構 哈夫曼編碼

time limit 1000ms memory limit 65536kb submit statistic problem description 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字...