哈夫曼樹壓縮 解壓縮檔案

2022-03-06 14:34:03 字數 2648 閱讀 5417

tips:注意二進位制讀寫檔案回車為:\r\n

**詳細分析改天再填坑。。。

還有單純形演算法-->  github:

#include #include 

#include

#include

#include

#include

#include

using

namespace

std;

template

struct

huffnode

};class

hufftree

;hufftree::hufftree(

const

char *filename)

num =hufflist.size();

printf(

"%d\n

",num);

nodetable = new huffnode[num*2-1

]; list

char> >::iterator iter =hufflist.begin();

for(int i = 0;i)

fclose(fin1);

}void hufftree::addchar(const

char

s) }

if(iter==hufflist.end())

}void

hufftree::createtree()

}bool hufftree::selectmin(const

int pos,int &minst)

if(minnum>pos)//

上乙個while的目的

return

false;//

ruguo false???

while(i<=pos)

minst =minnum;

}void

hufftree::createcode()

strcpy(nodetable[i].code,&tmpcode[start]);//}}

void

hufftree::compression()

}countch--;

if(countch>0

) cout

<"

"for(int t = 0;t)

}s =fgetc(fin);

}if(index>0

)

fclose(fin);

fclose(fout);

}hufftree::~hufftree()

void

hufftree::showcode()

}void

hufftree::createconfig()

fclose(fout);

}void hufftree::print(int p,file *fout,int &cnt)

cnt--;

}int hufftree::match(const

char prebuff,const

char buff,int &endat,file *fout,int &cnt)

if(prebuff[i]=='0'

)

else

child =nodetable[p].leftchild;

}if(child == -1)//

else

if(prebuff[0]!='\0'

) flag = 1

;

for(int i = 0;i<8;i++)

if(buff[i]=='0'

)

else

child =nodetable[p].leftchild;

}if(child == -1

)

else

return -1;}

void

hufftree::decompression()

sign =match(prebuff,buff,endat,fout,cnt);

if(sign>=0

)

else

readnum =fgetc(fin);

endat = 0

; sign = 0

; }

fclose(fin);

fclose(fout);

}int

main()

//這裡要說乙個背景,那就是在windows下,它會做乙個處理,就是寫檔案時,換行符會被轉換成回車,換行符存在磁碟檔案上,而讀磁碟上的檔案時,它又會進行逆處理,就是把檔案中連續的回車,換行符轉換成換行符。

//因此,在讀取乙個磁碟檔案時,文字方式讀取到檔案內容很有可能會比二進位制檔案短,因為文字方式讀取要把回車,換行兩個字元變成乙個字元,相當於截短了檔案。但是為什麼僅僅是可能呢?因為可能文中中不存在連著的45,42這兩個位元組(45是cr回車的ascii碼,42是換行符cl的ascii碼),也就不存在「截短」操作了,因此讀到的內容是一樣的。

//具體的來說,檔案檔案(以文字方式寫的),最好以文字方式讀。二進位制檔案(以二進位制方式寫的),最好以二進位制方式讀。不然可能會不正確。上面的已經分析了。

利用哈夫曼樹實現檔案壓縮和解壓縮

利用庫中的優先順序佇列實現哈夫曼樹,最後基於哈夫曼樹最終實現檔案壓縮。描述 1.統計檔案中字元出現的次數,利用優先順序佇列構建haffman樹,生成huffman編碼。構造過程可以使用priority queue輔助,每次pq.top 都可以取出權值 頻數 最小的節點。每取出兩個最小權值的節點,就n...

檔案壓縮(哈夫曼樹)

以字串 aaaabbbccd 為例實現檔案壓縮。1 統計各字元出現個數 a 4 b 3 c 2 d 1 2 利用各字元出現的次數作為權值構建huffman樹 哈夫曼樹又稱為最優二叉樹,是加權路徑長度最短的二叉樹。構建規則 每次在給定資料中挑選出兩個權值最小的數,分別作為左右孩子節點,構建乙個父節點將...

哈夫曼編碼檔案壓縮解壓

哈夫曼編碼檔案壓縮解壓 沒整懂這份 竟然只能壓縮文字檔案,而且內容不能包含中文,不能解壓大於 8 k 的zip壓縮檔案 還有就是如果使用哈夫曼編碼壓縮的內容重複率不高,壓縮的效果不明顯,如果內容的重複率高壓縮的效果好點 呼叫封裝 public static byte hufmanzip byte b...