《2022年2022年哈夫曼算法压缩和解压字符串 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年哈夫曼算法压缩和解压字符串 .pdf(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、2010-12-02 22:39 原 文件编码 2 用哈夫曼算法压缩和解压字符串#include #include #include /char * chrs = At the highest level of abstraction, there are three basic drawing operations: clearing the window, drawing a geometric object, and drawing a raster object. Raster objects, which include such things as two-dimensional
2、images, bitmaps, and character fonts, are covered in Chapter 8 . In this chapter, you learn how to clear the screen and to draw geometric objects, including points, straight lines, and flat polygons. 0; /char * chrs = kgasdgalfjsladd0; char * chrs = fsskffffaavbbbcscscscs0; int asciiCharsCount128; c
3、har currlCodeChrs9; int charCountSize = 0; long totalUrlLength = 0; long totalUrlOffset = 0; int currlMinValueIndex = -1;/当前最小值的索引char * resultBinString; /二进制字符串long binStringIndex = 0; /二进制字符索引char * resultBytes; /编码后的字节int resultByteSize = 0; /编码后字节的数量typedef struct treeNode /树节点 char nodename; /代
4、表的字符 int nodeFlag; /1:叶节点 ,0: 根节点 int weight; /权值, 字符的频率 char * url; /路径 TreeNode; /= void initCharCount() int i=0; memset(&asciiCharsCount,0,sizeof(asciiCharsCount); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - for(i=0;i(int)(strlen(chr
5、s);i+) int curlChar = (int)(chrsi); asciiCharsCountcurlChar = asciiCharsCountcurlChar + 1; int getMinValue() /查找数量大于 0, 并且最小的索引 int relIndex = -1; int minValue = (int)(strlen(chrs); int i=0; for(i=0;i 0) if(minValue asciiCharsCounti) minValue = asciiCharsCounti; relIndex = i; return relIndex; void b
6、inChrsToByte() int i=0; char hChrs5; char lChrs5; int resultValue = 0 x00; char bTable65 = 00000001001000110100010101100111100010011010101111001101111011110; for(i=0;i4;i+) hChrsi = currlCodeChrsi; lChrsi = currlCodeChrsi+4; hChrs4 = 0; lChrs4 = 0; for(i=0;i16;i+) int j=0; int isEqul = 1; for(j=0;j4
7、;j+) if(hChrsj = bTable(i*4)+j) if(isEqul = 4) /如果四个字符都相同名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - resultValue = i*16; isEqul +; for(i=0;i16;i+) int j=0; int isEqul = 1; for(j=0;j4;j+) if(lChrsj = bTable(i*4)+j) if(isEqul = 4) /如果四个字符
8、都相同 resultValue = resultValue + i; isEqul +; printf( %x ,resultValue); int main() int i=0; int treeNodeIndex = 0; TreeNode * treeNode; initCharCount(); for(i=0;i 0) charCountSize +; printf(-n); printf(开始构建树 :n); /总节点数量 =2n-1 (n 是出现过的字符的数量 ) treeNode = (TreeNode *)malloc(2*charCountSize-1) * sizeof(T
9、reeNode); for(i=0;i(2*charCountSize-1);i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - if(i%2 = 0) if(i=(2*charCountSize-2) /根节点不取最小值 treeNodetreeNodeIndex.nodeFlag = 0; treeNodetreeNodeIndex.weight = (treeNodetreeNodeIndex-2.weight)+(t
10、reeNodetreeNodeIndex-1.weight); printf( 根节点 %d n,i); else int urlChrI = 0; int depth = (charCountSize-i/2-1); char * url; url = (char *)malloc(depth); for(urlChrI=0;urlChrI %s n,url); treeNodetreeNodeIndex.url = url; asciiCharsCountcurrlMinValueIndex = 0; printf( 左节点 索引:%d 权:%d url:%s n,treeNodeInde
11、x,treeNodetreeNodeIndex.weight,treeNodetreeNodeIndex.url); if(i%2 = 1) if(i=1) int urlChrI = 0; int depth = (charCountSize-i/2-1); char * url; url = (char *)malloc(depth); for(urlChrI=0;urlChrI %s n,url); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - -
12、 - - - - - - currlMinValueIndex = getMinValue(); treeNodetreeNodeIndex.nodeFlag = 1; treeNodetreeNodeIndex.nodename = (char)currlMinValueIndex; treeNodetreeNodeIndex.weight = asciiCharsCountcurrlMinValueIndex; treeNodetreeNodeIndex.url = url; asciiCharsCountcurrlMinValueIndex = 0; printf( 右节点 索引:%d
13、权:%d url:%s n,treeNodeIndex,treeNodetreeNodeIndex.weight,treeNodetreeNodeIndex.url); else treeNodetreeNodeIndex.nodeFlag = 0; treeNodetreeNodeIndex.weight = (treeNodetreeNodeIndex-3.weight)+(treeNodetreeNodeIndex-2.weight); printf( 右节点 %dn,i); treeNodeIndex +; /printf(依次取最小频率字符 %c n,currlMinValueInd
14、ex); printf(-n); printf(编码前的字符串 : %s n,chrs); for(i=0;i(int)(strlen(chrs);i+) int j=0; for(j=0;j(2*charCountSize-1);j+) if(chrsi = treeNodej.nodename) /printf(%s ,treeNodej.url); totalUrlLength += strlen(treeNodej.url); /printf(n); resultBinString = (char *)malloc(totalUrlLength); for(i=0;i(int)(str
15、len(chrs);i+) int j=0; for(j=0;j(2*charCountSize-1);j+) if(chrsi = treeNodej.nodename) int k=totalUrlOffset; int urlCharIndex = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - for(k=totalUrlOffset;k(int)(totalUrlOffset+(strlen(treeNodej.
16、url);k+) resultBinStringk = treeNodej.urlurlCharIndex; urlCharIndex +; totalUrlOffset += strlen(treeNodej.url); resultBinStringtotalUrlLength = 0; printf(编码后的字符串 : %s n,resultBinString); printf(-n); if(strlen(resultBinString)%8 != 0) resultByteSize = (strlen(resultBinString)/8 + 1; else resultByteSi
17、ze = (strlen(resultBinString)/8; resultBytes = (char *)malloc(resultByteSize); printf(压缩后的数据 : ); for(i=0;iresultByteSize;i+) int j=0; for(j=0;j= (long)(strlen(resultBinString) currlCodeChrsj = 0; /printf(%d %c n,j,0); if(binStringIndex (long)(strlen(resultBinString) currlCodeChrsj = resultBinString
18、binStringIndex; /printf(%d %c n,j,resultBinStringbinStringIndex); binStringIndex +; currlCodeChrs8 = 0; binChrsToByte(); printf(n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - printf(压缩比例 %d : %d n,strlen(chrs),resultByteSize); /printf(
19、n TotalCount : %d n,(strlen(chrs); printf(-n); /下面开始解码数据 long bingCharIndex = 0; int chrsIndex =0; char * outputDecodeChrs; i=0; outputDecodeChrs = (char *)malloc(strlen(chrs); printf(开始解码数据 n); for(chrsIndex=0;chrsIndex(int)strlen(chrs);chrsIndex+) int j=0; for(j=0;j(int)(2*charCountSize-1);j+) if(
20、treeNodej.nodeFlag = 1) int k=0; int chrEqulCount = 1; for(k=0;k(int)strlen(treeNodej.url);k+) if(treeNodej.urlk = resultBinStringbingCharIndex+k) if(chrEqulCount = (int)strlen(treeNodej.url) printf( 解码字符 : %c %s n,treeNodej.nodename,treeNodej.url); outputDecodeChrsi = treeNodej.nodename; bingCharIn
21、dex = bingCharIndex + (int)strlen(treeNodej.url); i+; chrEqulCount +; outputDecodeChrsstrlen(chrs) = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - /strlen(chrs); /有 strlen(chrs)个 url printf(解码后的字符串 : %s n,outputDecodeChrs); printf(-n); return 0; 运行效果 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -