谁能提供C语言的哈弗曼压缩算法
有一个BMP图像,给出了对应DAT,想设计哈弗曼算法压缩DAT,用C语言,C++也行,想参考下,好的再加分
有一个BMP图像,给出了对应DAT,想设计哈弗曼算法压缩DAT,用C语言,C++也行,想参考下,好的再加分
答案:哈弗曼编码涵义是将一窜数字或者字母按哈弗曼数的形式编码,并使得这窜字符中的每个数字或者字母都能被唯一的“0,1”序列来编码,而且没有相同的前缀,这是一种非等长的编码方式。
如果你觉得这样解释很难听懂的话就举个例子:
如果用计算机发信息,只能用0和1,但是每个字母的使用频度又不一样,比如a ,i,o,e等这些字母使用的就多些,而z,v这样的字母使用的就少一些,如果所有字母都用等长的0,1序列来编码的话会造成浪费,那么我们就把常用的字母用少点的0,1,进行编码(比如用两个或三个),不常用的再用多点0,1编码,但是还不能造成油相同前缀的情况,这会使计算机无法识别,比如E用010,z用01001,计算机就只能识别出前面三个是E,而后面就抛弃或者识别出别的字母。哈弗曼编码就是出于这样的条件下产生的。也许这样的形容还是很抽象,那么再具体点。
加入a,b,c,d,e使用的频度分别是10,7,5,5,3
那么就可以构造哈弗曼数:
从树顶到树根,假如左边是0,右边是1,那么就能得到他们的哈弗曼编码(就是从上到下,到达他们字母经过的路径),分别是:
a:00;b:11;c:10;d:011;e:010;
你可以发现他们全部没有相同的前缀。
具体的编码方式我可以大致的跟你说下,因为我还在上班所以无法使用自己的电脑进行编译,怕写的有错误,
你拿到一个待编码的数据肯定有标识符(即上面的a,b,c),还有所带的权值(即3,5,5等)
你需要用哈弗曼算法构造出哈弗曼编码,即每次取最小的两个数当作叶子,来生成树根(树根的值等于他们的和),整数据就少了一个,直到最后两个数相加的值作为最终的树根。
然后从上往下,左边为0右边为1,到达每个树叶(即是标识符的位置),那么路径的编码就是他的哈弗曼编码。
以上是算法,建议你可以用一个结构体(带标识符,权值,哈弗曼编码(编码暂时为空)),用一个vector(C++里面的数据类型)装载他们并按照权值大小进行排序,然后通过哈弗曼算法(另用一个函数来计算)创建一个哈弗曼数,并计算出它的哈弗曼编码并写到结构体中,这样就把字符进行了哈弗曼压缩。
这就是整个过程
上一个:C语言编程题 帮我检查下程序
下一个:c语言在用VC6.0执行程序的时,按F4查看错误,提示执行 cl.exe 时出错.是什么意思?