/*
霍夫曼編碼
哈夫曼樹(huffman tree),又叫最優二叉樹,指的是對於一組具有確定權值的葉子結點的具有最小帶權路徑長度的二叉樹
1.資料移動時無符號不同於有符號,右移要預設為0
2.檔案操作以位元組為最小單位。湊足寫入,最後多乙個位元組寫上次剩餘多少
3.區分葉子節點與內部節點,8個字元的最長路徑為7
無符號型別的應用,位操作在有符號時候會帶符號操作,當系統使用文字方式開啟檔案後,會對回車做相應處理。檔案讀取不正確
移位操作時候注意左右不同。當最後乙個單元不能完全儲存時,最後用乙個來儲存最後一次操作的位數
k<<=32-count;移位至前面,自底向上尋找編碼,但從上到下使用
*/#include#include#include#include#define n 511
#define m 256
typedef struct htree
tree;
tree tree[n]=;
void encode();
void hufftree();
void getcode();
void crackcode();
void printcode();
void translatecode(unsigned char *rdtemp,int filesize);
int main() }
return 0;
}void encode();
int i;
unsigned char rdtemp[100000];
i=sizeof(unsigned char);
long filesize;
fseek(fp,0,2);
filesize=ftell(fp);
rewind(fp);
fread(rdtemp,filesize,1,fp);
fclose(fp); //讀入文字
i=0;
while(i>=1;
codenum++;
j=tree[i].parent;
if(tree[j].rchild == i)
tree[chcount].code |=0x80000000;
i=j;
} tree[chcount].codenum=codenum;
chcount++;
}/*for(i=j=0;ij?tree[i].codenum:j;
//printf("%c %d\n",tree[i].ch,tree[i].code);
}*/}void translatecode(unsigned char *rdtemp,int filesize)
{ file *fp;
int i,j,count;
unsigned int k,l;
if((fp=fopen("htest.txt","wb"))==null)
exit(0);
fwrite(tree,sizeof(tree),n,fp);
for(i=k=count=0;i
哈夫曼編碼的乙個實際應用
本問題是來自於課堂上老師關於貪心問題的第三講.huffman編碼是最有效的二進位制編碼,其中貪心策略主要體現在根據頻度來設定編碼長度.最早在資料結構的便有學習到,當時採用的建樹方式是帶指標的結構體 小頂堆 使用小頂堆的優勢在於堆是動態的,同時也有較高的效率 插入和刪除並調整的效率約為o lgn 查詢...
哈夫曼編碼的乙個實際應用(壓縮)
在課堂上,我們學習了哈夫曼編碼的原理和實現方法,上實驗課時也動手實現過,後來我們又追加介紹了哈夫曼編碼的實際壓縮和解壓縮的實現方法,並且在課堂上也演示了,但當時我們卻忽略了乙個環節,那就是實際檔案儲存時,二進位制是位元位,而儲存的單位一般是位元組,顯示時又是按照十六進製制的。現在給你乙個由字典裡的字...
我寫哈夫曼樹的一點心得及改進
一 首先,討論並比較基於字元的壓縮與基於單詞的壓縮 1.基於字元的壓縮所用的儲存空間固定,但由於每個字元都要編碼,相比基於單詞的壓縮在文章字數較少時更加適用 3.對於不同的文章,應綜合考慮,或者在大量統計的基礎上得出普適規律 4.無論是基於字元的壓縮還是基於單詞的壓縮如果應用k叉樹,則空間利用率都會...