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...