信息论哈夫曼编码算术编码lz编码
- 格式:pdf
- 大小:467.34 KB
- 文档页数:18
哈夫曼编码算法的原理及应用随着信息技术的快速发展和数字化时代的到来,数据量的增加、存储和传输的要求也愈加严格。
如何用最少的存储空间传输最多的信息,成为了数字化时代数据处理的重要问题。
哈夫曼编码算法由于它对数据的高效压缩和快速解压,已经成为信息技术领域中常用的压缩算法之一。
一、哈夫曼编码算法的原理哈夫曼编码算法是由美国数学家哈夫曼在1952年发明的一种高效的数据压缩算法,它是一种前缀编码方式,利用不同字符出现的频率不同,将频率小的字符用较短的编码表达,频率大的字符则用较长的编码表示。
在编码表中,任何一个字符的编码都不会是另一个的编码的前缀,这就是哈夫曼编码的前缀编码优势。
采用哈夫曼编码算法最终压缩得到的数据是无损的,因为压缩后的数据是通过编码表进行翻译的,不会出现错误的情况。
哈夫曼编码算法的实现包括两个主要步骤:创建哈夫曼树和生成哈夫曼编码。
创建哈夫曼树:哈夫曼树是由哈夫曼算法创建的,其基本思想是将每个字符看作一棵树,以该字符出现的频率为权值,进行递归合并,直到所有的树合并为一棵哈夫曼树。
哈夫曼树的结构可以用一棵二叉树来表示,每个节点代表一个字符或者一个由多个字符组成的字符串。
生成哈夫曼编码:通过哈夫曼树可以生成哈夫曼编码表,哈夫曼编码表可以用一个映射关系来表示,将每个字符与对应的编码对应起来。
在哈夫曼树的遍历过程中,当向左走时,添加0到编码中,向右走时,添加1到编码中,直到到达叶子节点时,记录下该字符的哈夫曼编码。
二、哈夫曼编码算法的应用哈夫曼编码算法的应用非常广泛,除了在数据压缩中广泛应用外,它在通信、数据存储等领域也有很多应用。
下面我们介绍几个典型的应用场景。
1. 压缩和解压缩作为一种高效的数据压缩算法,哈夫曼编码算法被广泛应用于文件和图像等数据的压缩和解压缩中。
哈夫曼编码通过对数据进行更高效的压缩,可以节约存储空间和传输带宽。
在压缩文件的过程中,压缩后的文件大小通常能缩小到原来的50%以下。
(完整)哈夫曼编码_汉明编码编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)哈夫曼编码_汉明编码)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)哈夫曼编码_汉明编码的全部内容。
1 课题描述信息论理论基础的建立,一般来说开始与香农(C.E。
Shannon)在研究通信系统时所发表的论文。
信息论是在信息可以度量的基础上,对如何有效、可靠的传递信息进行研究的科学,它涉及信息亮度、信息特性、信息传输速率、信道容量、干扰对信息传输的影响等方面的知识。
通常把上述范围的信息论称为狭义信息论,又因为它的创始人是香农,故又称为香农信息论。
广义信息论则包含通信的全部统计问题的研究,除了香农信息论之外,还包括信号设计、噪声理论、信号的检测与估值等。
当信息在传输、存储和处理的过程中,不可避免的要受到噪声或其他无用信号的干扰时,信息理论会为可靠、有效的从数据中提取信息提供必要的根据和方法。
因此必须研究噪声和干扰的性质以及它们与信息本质上的差别,噪声与干扰往往具有某种统计规律的随机特性,信息则具有一定的概率特性,如度量信息量的熵值就是概率性质的。
信息论、概率轮、随机过程和数理统计学是信息论应用的基础和工具。
信息论主要研究如何提高信息系统的可靠性、有效性、保密性和认证性,以使信息系统最优化.所谓可靠性高就是要使信源发出的消息经过信道传输以后,尽可能准确的、不失真的再现在接收端;而所谓有效性高,就是经济效果好,即用尽可能少的资源和尽可能少的设备来传送一定数量的信息;所谓保密性就是隐蔽和保护通信系统中传送的信息,使它只能被授权接受者获取,而不能被未授权者接受和理解;而认证性是指接受者能正确的判断所接受的消息的正确性,验证消息的完整性,而不是接收伪造的和被修改的信息。
3.5 算术编码•Huffman编码虽然是最佳编码,但对于二元信源,必须对二元信源的n次扩展信源进行编码,才能使平均码长接近于信源熵,提高编码效率。
当n 较大时编码过于复杂。
•算术编码不同于Huffman编码,是非分组码。
它从全序列出发,考虑符号之间的依赖关系,采用递推形式进行编码。
算术编码无需计算所有长为L 的信源序列的分布。
3.5 算术编码•Shannon-Fano-Elias码1968。
算术编码J.Rissanen1976•直接对一个消息序列编码,可以达到渐进最佳性能•算术编码中,信源符号与码字之间不存在一一对应关系•码字是定义在一个介于0和1之间的实数•当消息的符号增加时,用于消息的间隔变得更小,而表示间隔所需的信息单元变得更多了•算术编码是JPEG和FAX的基础累积分布函数与Shannon-Fano-Elias编码3.5 LZ783.4.3 LZ78(分段编码)设有消息序列:其中符号集为m 元集A ,即把序列分成不同的段。
分段规则:尽可能取最少个连着的符号,并能保证各段都不相同。
开始取一个符号作为一段,以后有同样的符号时,就再取后面1个符号合起来作为一段,以与前面的段不同。
有了许多段后,再分段时应查看前面所有的段,如有重复就添加符号再查看,直至与前面所有的段不同为止。
可见,每一段都是前面某一段加一个符号。
01,,...,m x x x {}011,,...,r m x A a a a −∈=3.5 LZ78LZ编码的特点特点一编码效率可以接近信息熵的上限。
特点二不需要事先知道信源的概率分布。
特点三用一种巧妙的方式使用字典技术。
特点四文件越小,压缩比例越小;文件越大,压缩比例越大。
应用领域如PKZIP、WinZIP、WinRAR、gzip等压缩工具以及ZIP、GIF、PNG等文件格式都是LZ系列算法的受益者。
5判断一个已知码的唯一可译性的方法:Sardinas-Patterson 测试{}{}{}{}{}234501,010,110,0110,11,10,1110,01,10,11......C C F F F F =====例题 判断唯一可译性是唯一可译码•设C 为码字集合,按以下步骤构造此码的尾随后缀集合F :•(1) 考查C 中所有的码字,若Wi是Wj 的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;•(2) 考查C 和Fi 两个集合,若Wj ∈C 是Wi ∈Fi 的前缀或Wi∈Fi 是Wj ∈C 的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; •(3)F=∪Fi 即为码C 的尾随后缀集合; •(4) 若F 中出现了C中的元素,则算法终止,返回假(C 不是唯一可译码);否则若F 中没有出现新的元素,则返回真。
C语言数据压缩哈夫曼编码和LZW算法C语言数据压缩——哈夫曼编码与LZW算法在计算机科学中,数据压缩是一种重要的技术,它可以有效地减少数据的存储空间和传输带宽。
本文将介绍两种常用的数据压缩算法,分别是哈夫曼编码和LZW算法,并给出它们在C语言中的实现方法。
一、哈夫曼编码1. 哈夫曼编码的原理哈夫曼编码是一种前缀编码方法,它根据字符出现的频率构建一棵表示编码的二叉树,频率越高的字符离根节点越近。
通过将二叉树的左、右分支分别标记为0和1,可以得到每个字符的唯一编码。
2. 实现哈夫曼编码的步骤(1)统计字符频率:遍历待压缩的数据,统计每个字符出现的频率。
(2)构建哈夫曼树:根据字符频率构建哈夫曼树,使用优先队列或堆来实现。
(3)生成哈夫曼编码表:通过遍历哈夫曼树,从根节点到各个叶子节点的路径上的0、1序列构建编码表。
(4)进行编码:根据生成的哈夫曼编码表,将待压缩数据转换为对应的编码。
(5)进行解码:利用哈夫曼树和生成的哈夫曼编码表,将编码解析为原始数据。
二、LZW算法1. LZW算法的原理LZW算法是一种字典压缩算法,它不需要事先进行字符频率统计,而是根据输入数据动态构建一个字典。
将输入数据中的序列与字典中的条目逐一匹配,若匹配成功则继续匹配下一个字符,若匹配失败则将当前序列加入字典,并输出该序列的编码。
2. 实现LZW算法的步骤(1)初始化字典:将所有可能的单字符作为字典的初始条目。
(2)读入输入数据:依次读入待压缩的数据。
(3)匹配字典:将读入的字符与字典中的条目逐一匹配,直到无法匹配成功。
(4)输出编码:将匹配成功的条目对应的编码输出。
(5)更新字典:若匹配失败,则将当前序列添加到字典中,并输出前一个匹配成功的条目对应的编码。
(6)重复步骤(3)至(5),直到输入数据全部处理完毕。
三、C语言实现1. 哈夫曼编码的C语言实现```c// TODO:哈夫曼编码的C语言实现```2. LZW算法的C语言实现```c// TODO:LZW算法的C语言实现```四、总结本文介绍了C语言中两种常用的数据压缩算法——哈夫曼编码和LZW算法。
压缩率高的压缩算法随着信息技术的不断发展,数据的存储和传输需求也越来越大。
为了更高效地利用存储空间和提高网络传输速度,压缩算法应运而生。
压缩算法是通过对数据进行编码和解码,以减少数据的存储空间和传输带宽的占用。
在众多压缩算法中,有一些算法以其高压缩率而著名。
一、LZ77压缩算法LZ77是一种基于字典的压缩算法,它通过利用重复出现的字符串来减少数据的存储空间。
该算法在编码过程中,将字符串分成固定大小的窗口,并在窗口内查找匹配的字符串。
编码时,将匹配的字符串用指针指向之前出现的位置,并记录匹配字符串之后的字符。
解码时,根据指针和记录的字符,可以还原出原始字符串。
LZ77算法在文本和图像等数据中具有较好的压缩效果,能够显著减少存储空间的占用。
二、哈夫曼编码哈夫曼编码是一种变长编码算法,它通过对频率较高的字符使用较短的编码,对频率较低的字符使用较长的编码,从而达到高压缩率的效果。
该算法首先统计字符出现的频率,然后根据频率构建哈夫曼树。
树的叶子节点表示字符,路径上的编码表示字符的编码。
编码时,将字符替换为对应的编码,解码时,根据编码树还原原始字符。
哈夫曼编码在文本和图像等数据中具有较高的压缩率,能够有效减少存储空间的占用。
三、算术编码算术编码是一种连续编码算法,它通过对数据中的每个符号进行编码,从而实现高压缩率的效果。
该算法将数据的范围映射到一个连续的区间,编码时,根据符号在区间中的位置来确定编码。
解码时,根据编码和区间映射关系还原原始数据。
算术编码在文本和图像等数据中具有较高的压缩率,能够极大地减少存储空间的占用。
四、LZW压缩算法LZW是一种基于字典的压缩算法,它通过建立字典来减少数据的存储空间。
该算法在编码过程中,将输入的字符串逐个字符地添加到字典中,并记录对应的编码。
当输入的字符串在字典中已经存在时,将其对应的编码输出,并将其与下一个字符组合成新的字符串添加到字典中。
解码时,根据编码和字典还原原始字符串。
1.哈夫曼编码的方法编码过程如下:<1> 将信源符号按概率递减顺序排列;<2> 把两个最小的概率加起来, 作为新符号的概率;<3> 重复步骤<1> 、<2>, 直到概率和达到1 为止;<4> 在每次合并消息时,将被合并的消息赋以1和0或0和1;<5> 寻找从每个信源符号到概率为1处的路径,记录下路径上的1和0;<6> 对每个符号写出"1"、"0"序列〔从码数的根到终节点〕.2.哈夫曼编码的特点①哈夫曼方法构造出来的码不是唯一的 .原因·在给两个分支赋值时, 可以是左支< 或上支> 为0, 也可以是右支< 或下支> 为0, 造成编码的不唯一.·当两个消息的概率相等时, 谁前谁后也是随机的, 构造出来的码字就不是唯一的.②哈夫曼编码码字字长参差不齐, 因此硬件实现起来不大方便.③哈夫曼编码对不同的信源的编码效率是不同的.·当信源概率是2 的负幂时, 哈夫曼码的编码效率达到100%;·当信源概率相等时, 其编码效率最低.·只有在概率分布很不均匀时, 哈夫曼编码才会收到显著的效果, 而在信源分布均匀的情况下, 一般不使用哈夫曼编码.④对信源进行哈夫曼编码后, 形成了一个哈夫曼编码表.解码时, 必须参照这一哈夫编码表才能正确译码.·在信源的存储与传输过程中必须首先存储或传输这一哈夫曼编码表在实际计算压缩效果时, 必须考虑哈夫曼编码表占有的比特数.在某些应用场合, 信源概率服从于某一分布或存在一定规律< 这主要由大量的统计得到>, 这样就可以在发送端和接收端固定哈夫曼编码表, 在传输数据时就省去了传输哈夫曼编码表, 这种方法称为哈夫曼编码表缺省使用.使用缺省的哈夫曼编码表有两点好处:·降低了编码的时间, 改变了编码和解码的时间不对称性;·便于用硬件实现, 编码和解码电路相对简单.这种方法适用于实时性要求较强的场合.虽然这种方法对某一个特定应用来说不一定最好, 但从总体上说, 只要哈夫曼编表基于大量概率统计,其编码效果是足够好的.3.哈夫曼编码举例现在有8个待编码的符号M0,….,M0 它们的概率如下表所示,使用霍夫曼编码算法求出8个符号所分配的代码.〔写出编码树〕待编码的符号概率M00.2M10.4M20.1M30.15M40.03M50.04M60.07M70.01解:为了进行哈夫曼编码, 先把这组数据由大到小排列, 再按上方法处理〔1〕将信源符号按概率递减顺序排列.〔2〕首先将概率最小的两个符号的概率相加,合成一个新的数值.〔3〕把合成的数值看成是一个新的组合符号概率,重复上述操作,直到剩下最后两个符号.5.4.2 Shannon-Famo编码Shannon-Famo<S-F> 编码方法与Huffman 的编码方法略有区别, 但有时也能编出最佳码. 1.S-F码主要准则符合即时码条件;在码字中,1 和0 是独立的, 而且是< 或差不多是>等概率的.这样的准则一方面能保证无需用间隔区分码字,同时又保证每一位码字几乎有1位的信息量. 2.S-F码的编码过程信源符号按概率递减顺序排列;把符号集分成两个子集, 每个子集的概率和相等或近似相等;对第一个子集赋编码"0", 对第二个子集赋编码"1";重复上述步骤, 直到每个子集只包含一个信源符号为止.5.4.3 游程编码游程编码<简写为RLE或RLC>是一种十分简单的压缩方法,它将数据流中连续出现的字符< 称为游程> 用单一的记号来表示.例如,字符串a b a C C C b b a a a a可以压缩为a b a 3c 2b 4a游程编码的压缩效果不太好, 但由于简单, 编码/ 解码的速度非常快, 因此仍然得到广泛的应用.许多图形和视频文件, 如 .BMP,.TIF 与 .AVI 等, 都使用了这种压缩.5.4.4 算术编码1.算术编码算术编码把一个信源集合表示为实数线上的0 到1 之间的一个区间.这个集合中的每个元素都要用来缩短这个区间.信源集合的元素越多,所得到的区间就越小,当区间变小时,就需要更多的数位来表示这个区间,这就是区间作为代码的原理.算术编码首先假设一个信源的概率模型,然后用这些概率来缩小表示信源集的区间.2.举例说明算术编码过程[ 例]设英文元音字母采用固定模式符号概率分配如下:字符 a e i o u概率0.2 0.3 0.1 0.2 0.2范围[0,0.2] [0.2,0.5] [0.5,0.6] [0.6,0.8] [0.8,1.0]设编码的数据串为eai .令high 为编码间隔的高端,low 为编码间隔的低端, range 为编码间隔的长度,rangelow 为编码字符分配的间隔低端,rangehigh 为编码字符分配的间隔高端.初始high=1,low=0,range=high-low, 一个字符编码后新的low 和high 按下式计算:·low =low+range × rangelow·high =low+range×rangehigh<1> 在第一个字符e 被编码时,e 的rangelow=0.2,rangehigh=0.5, 因此: low=0 + 1 × 0.2 =0.2high=0 + 1 × 0.5 =0.5range=high-low=0.5-0.2=0.3此时分配给e 的范围为[0.2,0.5] .<2>第二个字符a 编码时使用新生成范围[0.2,0.5],a 的rangelow=0, rangehigh=0.2, 因此:low=0.2 十0.3 × 0=0.2high=0.2 +0.3 × 0.2=0.26range=0.06范围变成[0.2,0.26] .<3> 对下一个字符i 编号,i 的rangelow=0.5,rangehigh=0.6, 则:low=0.2 +0.06 × 0.5=0.23high=0.2 +0.06 × 0.6=0.236即用[0.23,0.236] 表示数据串eai, 如果解码器知道最后范围是[0.23,0.236 ]这一范围, 它马上可解得一个字符为e, 然后依次得到惟一解a, 即最终得到eai .3.算术编码的特点①不必预先定义概率模型, 自适应模式具有独特的优点;②信源符号概率接近时, 建议使用算术编码, 这种情况下其效率高于Huffman 编码;③算术编码绕过了用一个特定的代码替代一个输入符号的想法, 用一个浮点输出数值代替一个流的输入符号, 较长的复杂的消息输出的数值中就需要更多的位数.④算术编码实现方法复杂一些, 但JPEG 成员对多幅图像的测试结果表明, 算术编码比Huffman 编码提高了5% 左右的效率, 因此在JPEG 扩展系统中用算术编码取代Huffman 编码.。
算术编码的发展和研究热点一、简单介绍。
哈夫曼编码是一种常用的数据压缩编码方法,是哈夫曼于1952年为压缩文本文件提出的一种变长编码方法。
它的基本思想是对出现概率大的符号分配短字长的二进制代码,对出现概率小的符号则分配长字长的二进制代码,从而最终得到每个符号码字平均码长最短的码。
因此对每一个输入符号都对应一个码字,而且该输入符号的出现概率必须是2的整数次幂,对应的码字字长必须是整数比特。
算术编码(ARITHMETIC CODING)是利用信源统计特性对码率进行无损压缩的一种编码方式,属于熵编码范畴,实现算术编码首先需要知道信源发出每个符号的概率大小,然后再扫描符号序列,依次分割相应的区间,最终得到符号序列所对应的码字。
整个编码需要两个过程,即概率模型建立过程和扫描编码过程。
其编码的目的是为了最大程度的降低符号间冗余度,从而获得尽可能高的压缩效率。
早在上个世纪60年代,Abralnson就根据信息论中信源序列积累概率的概念提出了算术编码的基本思想,虽然它的编码效率非常理想,接近于最佳的编码效率,但由于计算精度的问题,直到70年代中期算术编码一直停留在理论阶段。
此后RubinGuazsanen和Langd等人对算术编码做出了不断改进,算术编码进入实用阶段,1987年IanH.witen等人公布了现代多符号算术编码的第一个纯软件版本,算术编码才逐渐得以比较广泛应用。
目前在不少的数据压缩领域都在应用算术编码,例如英文文件编码(领域)、活动图像和目前最新的H264视频压缩编译码标准和静止图像(JPEG压缩标准) 压缩编码领域。
下面简要的说明其编码原理,并与目前广泛应用的huffman编码做全面的比较,以此来说明算术编码的先进性,优越性。
算术编码的基本思想是用一个特定的代码来代替整串输入符号,并不为每个输入符号都产生一个单独的代码,而是为整个一条消息产生一个代码。
任何增加到消息中的每一个符号,都会提高代表该消息的浮点数值精度,这就需要更多的比特数来记录该浮点数值。
信息论实验报告实验人:邓放学号:20123022572014年11月21日一、实验目的1、掌握哈夫曼编码算法的基本原理;要求对图片进行哈夫曼编码。
2、掌握算术编码算法的基本原理;要求对图片进行算术编码。
3、掌握LZ算法的基本原理;要求对图片进行LZ编码。
二、实验原理1、哈夫曼编码l)将信号源的符号按照出现概率递减的顺序排列。
(注意,一定要递减)2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现的概率。
3)重复进行步骤1和2直到概率相加的结果等于1为止。
4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。
5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。
下面我举个简单例子:一串信号源S={s1,s2,s3,s4,s5}对应概率为p={40,30,15,10,5},(百分率)按照递减的格式排列概率后,根据第二步,会得到一个新的概率列表,依然按照递减排列,注意:如果遇到相同概率,合并后的概率放在下面!最后概率最大的编码为0,最小的编码为1。
如图所示:所以,编码结果为s1=1s2=00s3=010s4=0110s5=0111霍夫曼编码具有如下特点:1)编出来的码都是异字头码,保证了码的唯一可译性。
2)由于编码长度可变。
因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。
3)编码长度不统一,硬件实现有难度。
4)对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;若信号源符号的概率相等,则编码效率最低。
5)由于0与1的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。
2、算术编码根据信源可能发现的不同符号序列的概率,把[0,1]区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率。
这样信源发出的不同符号序列将与各子区间一一对应,因此每个子区间内的任意一个实数都可以用来表示对应的符号序列,这个数就是该符号序列所对应的码字。
显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特数就减少,因而相应的码字就越短。
3、LZ 编码设信源符号集A={a1,a2,…,aK}共K 个符号,设输入信源符号序列为u =(u1,u2,…,uL)编码是将此序列分成不同的段。
分段的规范为:尽可能取最少个相连的信源符号,并保证各段都不相同。
开始时,先取一个符号作为第一段,然后继续分段。
若出现与前面相同的符号时,就再取紧跟后面的一个符号一起组成一个段,使之与前面的段不同。
这些分段构成字典。
当字典达到一定大小后,再分段时就应查看有否与字典中的短语相同,若有重复就添加符号,以便与字典中短语不同,直至信源序列结束。
编码的码字由段号加一个符号组成。
设u 构成的字典中的短语共有M (u )个。
若编码为二元码,段号所需码长n=「log M (u )「(注:代表上取整符号),每个符号需要的码长为log [M (u)]。
单符号的码字段号为0,非单字符的码字段号为除最后一个符号外字典中相同短语的段号。
例如,设U={a1,a2,a3,a4},信源序列为a1,a3,a2,a3,a2,a4,a3,a2,a1,a4,a3,a2,a1,共13位,字典如表所示:rr P S p S P a S P )()(),(+=⎥⎥⎤⎢⎢⎡=)(1log S p L三、实验结果1.哈夫曼2.算术编码Gui界面3.Lz编码四.代码哈夫曼:clcclearclose all;%定义HufData/Len为全局变量的结构体global HufData;global Lendisp('计算机正在准备输出哈夫曼编码结果,请耐心等待……'); %原始码字的灰度I_rgb=imread('3.jpg');a=rgb2gray(I_rgb);%图像的灰度统计GrayStatistics=imhist(a);GrayStatistics=GrayStatistics';GrayRatioo=GrayStatistics/sum(GrayStatistics); GrayRatioNO=find(GrayRatioo~=0);Len=length(GrayRatioNO);%初始化灰度集,防止系统随即赋予其垃圾值GrayRatio=ones(1,Len);for i=1:LenGrayRatio(i)=GrayRatioo(i);endGrayRatio=abs(sort(-GrayRatio));%将图像灰度概率赋予结构体for i=1:LenHufData(i).value=GrayRatio(i);end%哈夫曼编码/霍夫曼编码HuffmanCode(Len);%输出码字zippedHuffman=1;for i=1:LentmpData=HufData(i).code;str='';for j=1:length(tmpData)str=strcat(str,num2str(tmpData(j)));zippedHuffman=zippedHuffman+1;enddisp(strcat(str))endi;%计算计算机一共输出多少个霍夫曼编码zippedHuffman;%计算在删去0灰度级压缩之前的原始图像字节容量unzipped_delete=i*8;%计算压缩比率ratio_delete=zippedHuffman\unzipped_delete;ad=num2str(ratio_delete*100);str2=strcat(ad,'%');disp(strcat('哈夫曼编码压缩比率','=',str2))算术A=imread('t01db9375674cc395c6.jpg');for k=1:length(A)if(A(k)==0)A(k)=1;elseif(A(k)==255)A(k)=254;endend[M,N]=size(A);temp=zeros(1,256);for m=1:M;for n=1:N;if A(m,n)==0;i=1;elsei=A(m,n);endtemp(i)=temp(i)+1;endendtemp=temp/(M*N);p=temp;[i,j,v]=find(p);pp=[j'v'];h=[];h=j';w=[];w=v';P=1;for k=1:length(A)P=(w(find((h<(A(k)+1))&(h>(A(k)-1)))))*P;endL=ceil(log2(1/P));g=[];g(1)=w(find((h<(A(1)+1))&(h>(A(1)-1))));ppp=[];ppp(1)=g(1);for k=2:length(A)g(k)=g(k-1)+g(k-1)*ppp(k-1);ppp(k)=ppp(k-1)*w(find((h<(A(k)+1))&(h>(A(k)-1))));t=g(k);endtLinnum=t;N=L-1;%输入为非整数的情况nint=floor(innum);%整数部分nf=innum-nint;%小数部分res_nint=dec2bin(nint);res_nint=double(res_nint)-48;count=0;tempnum=nf;record=zeros(1,N);while(N)count=count+1;%长度小于Nif(count>N)N=0;%return;endtempnum=tempnum*2;%小数转换为二进制,乘2取整if tempnum>1record(count)=1;tempnum=tempnum-1;elseif(tempnum==1)record(count)=1;N=0;%stop loopelserecord(count)=0;endendres_nf=record;numint=res_nint;numf=res_nf;num=[numint,numf]%ss=dec2bin(t*2^7)%ss=[ss(1:L)];%Lzunction LZmain()%LZ encode main functionclc;%open the source file to get the contentfid=fopen('1.jpeg','r');seq=fread(fid);fclose(fid);seq=reshape(seq,1,length(seq));if~isempty(seq)%call the Entropy function to calculate the source entropy[entropy]=Entropy(seq);%call the LZcode function to encode the symbol[dictionary codelength]=LZcode(seq);%calculate the efficiency,and display the entropy,average length %as well as efficiencyavglength=((codelength*length(dictionary))/length(seq));%efficiency=(length(seq)/(codelength*length(dictionary)));disp(strcat('Entropy=',num2str(entropy)));disp(strcat('Code length=',num2str(codelength)));disp(strcat('Average length=',num2str(avglength)));%disp(strcat('Efficiency=',num2str(efficiency)));display('Dictionary content:Look dictionary.m.');fiddic=fopen('dictionary.m','w');fprintf(fiddic,'The content of the dictionary is:\n');for i=1:length(dictionary)dic=fwrite(fiddic,[''''dictionary(i).sym''':'dictionary(i).code setstr(10)]);endfclose(fiddic);%encode the source file,and write the enseq into the file--encode.txtdisplay('Encoded Sequence:Look encode.txt.');enseq=LZencode(dictionary);fiden=fopen('encode.txt','w');en=fwrite(fiden,enseq);fclose(fiden);%decode the encode file,and write the deseq into the file--decode.txtdisplay('Decoded Sequence:Look decode.txt.');deseq=LZdecode(dictionary);fidde=fopen('decode.txt','w');de=fwrite(fidde,deseq);fclose(fiden);elsedisplay('Empty Sequence....');endend。