算数游程编码
- 格式:doc
- 大小:162.50 KB
- 文档页数:14
游程编码的应用场合
游程编码是一种无损压缩编码,其应用场景包括但不限于:
1.旅行管理软件:许多旅行管理软件都使用行程编码来记录和管理旅
行信息。
用户可以通过输入行程编码,快:速查询和管理自己的行程。
旅行管理软件还可以根据行程编码,提供相关的推荐和服务,如附近的景点美食等。
2.旅行社和导游服务:旅行社和导游服务可以使用行程编码来管理和
分享旅行信息。
3.图像格式压缩:游程编码可以用于二值图的有效压缩。
此外。
游程编码也厂泛应用于各种软件、声音影像格式等领域。
以上信息仅供参考,如有需要,建议您咨询专业技术人员。
游程编码翟文婕张亚群陈红古明春游程编码RCL:又称“游程长度编码”,“运行长度编码”,或“行程编码”,是一种统计编码,该编码啊属于无损编码(指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同)。
对于二值图有效。
在游程编码中,游码长度RL,简称游程,指由字符串构成的数据流中各个字符重复出现而形成的字符长度。
一.其编码的基本原理(RCL原理)如下:用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。
数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
需要注意的是:游程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。
二.游程编码算法一般游程编码有两种算法,一种是使用1的起始位置和1的游程长度,另一种是只使用游程长度,如果第一个编码值为0,则表示游程长度编码是从0像素的长度开始。
两种方法各有优缺点:前一种存储比第二种困难,因此编程也比较复杂。
而后一种需要知道第一个像素值,故压缩编码算法中需给出所读出的图的第一个像素值。
三.基本RLC方法分析:基本RLC方法就是在数据流中直接用(数据字符X、串的位置Sc、串的长度RL)3个字符来给出上述3种信息。
但是用Sc作为前缀的低效、原字符串中RL 的长度和出现频度不够显著。
导致不实用。
所以我们在实际使用过程中在二值图像和连续色调图像中可以省去Sc,这样使得改进的RCL在图像编码中得到了广泛的应用。
四.具体编码, 以二值图像的游程编码为例接下来就以二值图像的游程编码为例具体介绍一下游程编码算法二值图像指是指仅有黑(用“1”代表)、白(用“0”代表)两个亮度值的图像。
可借助各种图像通信方式传输,最经典的通信方式是传真。
在对他编码时要对不同的白长(白像素游程)和黑长(黑像素游程)按其出现概率的不同分别配以不同长度的码字。
摘要为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输出的符号序列所施行的变换。
具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。
最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
关键词:信源;信道;编码;游程编码1课题描述游程编码又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。
对于二值图有效。
在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
2 信源编码2.1概念一种以提高通信有效性为目的而对信源符号进行的变换;为了减少或消除信源剩余度而进行的信源符号变换,对输入信息进行编码,优化信息和压缩信息并且打成符合标准的数据包2.2信源编码作用信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。
2.3编码方式最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
实验二游程编码一、实验目的1、掌握游程编码原理;2、理解数据编码压缩和译码输出编码的实现。
二、实验要求实现游程编码和译码的生成算法。
三、实验内容输入一幅二值图像,先统计要压缩编码的文件中的字符字母出现的次数,按字符字母和空格出现的概率对其进行哈夫曼编码,然后读入要编码的文件,编码后存入另一个文件;接着再调出编码后的文件,并对其进行译码输出,最后存入另一个文件中。
四、实验原理1、xx树的定义:假设有n个权值,试构造一颗有n个叶子节点的二叉树,每个叶子带权值为wi,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树;2、xx树的构造:weight为输入的频率数组,把其中的值赋给依次建立的HT Node对象中的data属性,即每一个HT Node对应一个输入的频率。
然后根据data属性按从小到大顺序排序,每次从data取出两个最小和此次小的HT Node,将他们的data 相加,构造出新的HTNode作为他们的父节点,指针parent,leftchild,rightchild赋相应值。
在把这个新的节点插入最小堆。
按此步骤可以构造出一棵xx树。
通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent为树的顶点为止。
这样,根据每次向上搜索后,原节点为父节点的左孩子还是右孩子,来记录1或0,这样,每个频率都会有一个01编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。
五、实验程序#include<stdio.h>#include<string.h>#define NUM 1000char dat,flag,str[NUM],b[NUM];printf("(请输入待编码的字符串)\n\n");printf("原字符串为:");gets(str);//输入待编码的字符串flag=str[0];//记下第一个字符值作为flag游程编码的起始值/************************编码部分**********************************************/printf("\n游程编码为:");for(i=0;i<strlen(str);i++)//输入字符串的循环{if(str[i+1]==str[i])/************************译码部分**********************************************/printf("\n\n译码结果为:");for(j=0;j<h;j++)//对计数数组进行循环,次数为游程改变的次数{ for(z=0;z<a[j];z++)flag='1';else if(flag=='1')flag='0';//让flag轮流从0和1切换赋值}for(x=0;x<k;x++)printf("%c",b[x]);//将译出的码显示出来printf("\n\n\n");}八、结果分析九、实验心得。
游程编码原理游程编码游程编码(Run-length encoding,简称RLE)是一种简单的无损压缩算法,常用于对连续的重复数据进行压缩。
它的原理非常简单,通过记录数据中连续出现的游程(Run)的长度和值来减少数据的存储空间。
游程编码原理游程编码利用了重复连续数据的特点,将连续出现的重复数据用“重复次数+数据值”的形式进行存储。
例如,对于一串重复的数据“AAAABBBCCDAA”,使用游程编码后可以表示为“4A3B2C1D2A”。
游程编码过程游程编码的过程分为两个步骤:压缩和解压缩。
压缩1.从数据的开头开始,记录当前字符的值和游程长度,初始游程长度为1。
2.比较当前字符和下一个字符。
如果相同,则游程长度加1,并继续比较下一个字符;如果不同,则将当前字符的值和游程长度保存起来,然后重新开始记录下一个字符的值和游程长度。
3.重复步骤2,直到遍历完整个数据。
解压缩1.从压缩后的数据的开头开始,解析每个游程。
2.如果游程的长度为1,则直接将对应的值存入解压缩后的数据。
3.如果游程的长度大于1,则需要根据游程的长度复制对应的值,并存入解压缩后的数据。
游程编码的优缺点优点1.简单易懂:游程编码的原理简单,实现起来比较容易。
2.适用于重复数据:对于连续出现的重复数据,游程编码可以大幅度减少存储空间。
缺点1.不适用于随机数据:对于没有连续重复的数据,游程编码几乎没有压缩效果,甚至可能导致压缩后的数据比原始数据更长。
2.压缩率有限:尽管游程编码可以有效压缩连续的重复数据,但对于其他类型的数据,压缩效果有限。
游程编码在实际应用中的例子游程编码广泛应用于各种数据存储和传输场景中,特别是在图像和音频压缩中。
在图像压缩领域,游程编码被用于压缩二值图像(如黑白图像),以及压缩彩色图像的各个通道。
通过游程编码对连续的像素值进行压缩,可以大幅度减小图像文件的大小。
在音频压缩领域,游程编码常被用于对连续的音频样本进行压缩,尤其是对于采样率较高的音频。
游程编码原理(一)游程编码简介游程编码是一种常见的数据压缩算法,用于减少数据存储和传输所需的位数。
它基于游程的概念,可以将连续的重复数据序列编码为更短的表示形式。
本文将逐步解释游程编码的原理和实现方法。
1. 游程编码的基本原理游程编码的基本思想是将连续重复的数据序列用游程长度和数据值表示。
通过这种方式,可以大大减少数据的存储和传输所需的位数。
2. 简单游程编码在简单游程编码中,连续重复的数据序列被编码为(长度,值)的形式。
例如,序列“” 可以被编码为“(6,0)(3,1)(3,0)”。
这样,原始序列的长度从12位减少到13位。
3. 游程编码的优化为了进一步减少编码后数据的长度,游程编码可以采用不同的策略进行优化。
零值游程编码对于大量连续相同的零值序列,可以使用特殊的编码方式。
例如,序列“” 可以被编码为“0(10)”,只需两位表示。
长度编码游程编码的长度也可以进行优化。
当连续重复的数据长度超过一定阈值时,可以使用更短的表示形式表示长度。
自适应游程编码自适应游程编码是一种动态调整编码策略的算法。
它根据输入数据的特征动态选择最佳的编码方式,以进一步提高压缩比。
4. 游程解码对于进行游程编码压缩的数据,解码算法可以将编码后的数据重新还原为原始数据。
5. 游程编码的应用领域游程编码常被用于图像和视频压缩领域。
图像和视频数据中常存在大量连续重复的像素值,游程编码可以有效减少存储和传输数据所需的位数,提高压缩效率。
结论游程编码是一种常见的数据压缩算法,能够通过连续重复数据序列的编码,有效减少存储和传输数据所需的位数。
游程编码有不同的优化策略和应用领域,可以根据具体情况选择合适的编码方式,以提高压缩效率。
以上是对游程编码的简要介绍,希望能够帮助读者理解游程编码的原理和应用。
6. 游程编码的局限性虽然游程编码在某些情况下具有较好的压缩效果,但也存在一些局限性。
数据分布不均匀如果数据中没有连续重复的序列或者重复序列很短,游程编码的效果就会受到限制。
课程设计任务书专业:通信工程课程设计名称:信息论与编码课程设计设计题目:游程编码的分析与实现一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解游程编码方法的基本原理与特点;3、提高综合运用所学理论知识独立分析和解决问题的能力;4、使用MATLAB或其他语言进行编程。
二.设计内容读入一个图像,将每一个不同游程(不同颜色的像素块)的起始坐标和灰度值记录下来,以达到压缩图像存储空间的目的。
三.设计要求通过编码前后数据大小的对比显示压缩效果。
四.设计条件计算机、MATLAB或其他语言环境五.参考资料[1]曹雪虹,张宗橙.信息论与编码.北京:清华大学出版社,2007.[2]王慧琴.数字图像处理.北京:北京邮电大学出版社,2007.指导教师(签字):教研室主任(签字):批准日期:年月日游程编码的分析与实现摘要本文所研究的二值图像游程编码数据压缩,就是一种具有高压缩比的无损数据压缩技术,它是应用游程编码的原理对二值图像进行数据压缩的编码技术,其编码非常简单,编码和解码速度快,因此其应用范围广泛。
文章首先简要介绍了信源编码的原理,然后重点介绍游程编码的原理和实现技术,对游程编码技术做了较为全面的研究。
包括游程压缩模型、数据压缩、解压缩过程,比给出了相应的MATLAB程序。
关键词:游程编码,解码,信源编码,MATLAB目录1信源编码 (1)1.1信源编码简介 (1)1.2信源编码的理论基础 (1)1.3信源编码的分类及作用 (1)1.4信源编码的历史 (2)2游程编码 (2)2.1游程长度 (2)2.2游程编码算法 (2)2.3游程编码特点 (3)3游程编码的MATLAB实现 (3)3.1程序设计 (3)3.2输出结果 (5)3.2结果分析 (7)总结 (8)参考文献 (9)1信源编码1.1信源编码简介编码实质上就是对信源的原始符号按一定规则进行的一种变换。
编码可分为信源编码和信道编码。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。
java 游程编码
Java是一种高级编程语言,旨在为多平台开发提供便利。
Java
具有良好的跨平台性能和安全性,因此已被广泛应用于各种领域,例
如企业应用程序开发、移动应用程序开发和游戏开发等。
游程编码是一种基于重复数据的压缩算法,用于将连续的相同数
据序列压缩为单个数据字符和出现次数的组合。
Java中可以使用游程
编码来实现对于数据的高效压缩和解压缩,提高数据传输和存储的效率。
在Java中,可以使用InputStream和OutputStream类来实现游
程编码。
具体而言,需要先将需要压缩或解压缩的数据流读入内存中,然后使用游程编码算法对其进行处理,并将处理后的流写入到文件或
网络中。
例如,在数据传输过程中,可以使用Java的Socket类来创建网
络连接并传输数据。
使用游程编码算法对数据进行压缩,可以大幅减
少传输数据的大小和传输时间,提高网络传输效率。
总之,Java的游程编码算法提高了数据传输和存储效率,有助于优化程序性能和用户体验。
python 游程编码
游程编码(Run-length encoding)是一种简单的无损数据压缩算法。
它的工作原理是将连续的重复字符或数字序列替换为单个字符和其连续重复的次数。
以下是一个简单的 Python 实现:
python
def run_length_encoding(input_str):
output = []
count = 1
prev = None
for current in input_str:
if current == prev:
count += 1
else:
if prev is not None:
output.append((prev, count))
count = 1
prev = current
if prev is not None:
output.append((prev, count))
return output
# 测试函数
print(run_length_encoding('AAAABBBCCD')) # 输出:[(4, 'A'), (3, 'B'), (2, 'C'), (1, 'D')]
这个函数首先遍历输入字符串中的每个字符。
如果当前字符与前一个字符相同,则增加计数器。
如果当前字符与前一个字符不同,则将前一个字符和其计数添加到输出列表中,并重置计数器。
最后,如果最后一个字符没有添加到输出列表中,将其添加进去。
游程长度编码结构嘿,朋友!想象一下,你正在一个堆满了各种数据的大仓库里,这些数据就像杂乱无章的玩具,扔得到处都是。
这时候,游程长度编码结构就像一位神奇的整理大师,闪亮登场啦!让我给你讲讲我上次遇到的事儿。
那时候我正在处理一组图像数据,简直是一团乱麻。
每个像素点就像是调皮的孩子,到处乱跑,没有一点规律。
我抓耳挠腮,不知道该怎么让它们乖乖听话。
就在我几乎要崩溃的时候,有人跟我提到了游程长度编码结构。
我当时心里还犯嘀咕,这能行?结果一试,嘿,还真像那么回事!它就像是一个超级聪明的管家,把那些连续相同的数据当成一家人,给它们编上一个独特的号码,然后整齐地排好队。
比如说,一片连续的黑色像素,它就给标记成“黑色,长度10”,这样一下子就把复杂的数据变得简单明了。
这游程长度编码结构工作起来可认真啦!它不会放过任何一个连续的部分,不管是长是短,都能准确地给它们找到归属。
而且它特别节省空间,就好像是把原本占地方的大胖子,一下子变成了身材苗条的瘦子,让存储变得轻松多了。
你想想,如果没有它,那数据就像是一群没头的苍蝇,到处乱撞。
但是有了游程长度编码结构,数据们都规规矩矩地排好了队,等待着被处理和使用。
这难道不是很神奇吗?它的应用可广泛了!不仅在图像处理上大显身手,在其他领域,比如文件压缩、数据传输等等,也是一把好手。
就好像是一个万能的工具,到哪儿都能派上用场。
你说,要是没有游程长度编码结构,我们得在这些海量的数据中多费多少劲儿啊!它简直就是数据世界里的救星,让我们能够更高效、更轻松地处理和管理数据。
所以说,游程长度编码结构真的是太牛啦,给我们的生活和工作带来了极大的便利!。
算术编码与游程编码1 .课题描述1.理解和掌握算术编码和游程编码的基本原理。
2.编程实现算术编码和游程编码的基本流程。
3.了解算术编码和游程编码的优缺点。
4.分析实验结果。
2 信源编码的相关介绍编码实质上是对信源的原始符号按一定规则进行的一种变换。
编码可分为信源编码和信道编码。
信源编码:以提高通信有效性为目的的编码。
通常通过压缩信源的冗余度来实现。
采用的一般方法是压缩每个信源符号的平均比特数或信源的码率。
即同样多的信息用较少的码率传送,使单位时间内传送的平均信息量增加,从而提高通信的有效性。
•信源编码理论是信息论的一个重要分支,其理论基础是信源编码的两个定理。
–无失真信源编码定理:是离散信源/数字信号编码的基础;–限失真信源编码定理:是连续信源/模拟信号编码的基础。
•信源编码的分类:–离散信源编码:独立信源编码,可做到无失真编码;–连续信源编码:独立信源编码,只能做到限失真信源编码;–相关信源编码:非独立信源编码。
信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。
最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
另外,在数字电视领域,信源编码包括通用的MPEG—2编码和H.264(MPEG—Part10 AVC)编码等相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
•3 . 算术编码3.1算术编码算法算术编码在图像数据压缩标准中扮演了重要的角色, 是无损压缩的一种算术编码中用0和1之间的实数进行编码, 该编码用到两个基本的参数Α符号的概率和它的编码间隔信源符号的概率决定了压缩编码的效率, 也决定了编码过程中信源符号的间隔, 而这些间隔包含在0到1之间编码过程中的间隔决定了符号压缩后的输出算术编码的编码过程如下Α算术编码把一个信源集合表示为实数线上的0 到1 之间的一个区间。
java 游程编码
Java游程编码是一种基于游程长度编码的数据压缩算法,常用
于无损压缩图像和视频数据。
其原理是将连续出现的相同像素值或颜色值用一个计数器表示,从而减少数据的存储量。
在Java中,可以
使用位运算和字节流实现游程编码,具有较高的压缩效率和处理速度。
Java游程编码的实现过程包括以下几个步骤:
1.将原始数据转换为像素或颜色值的序列。
2.遍历序列,统计连续出现的像素或颜色值的长度和出现次数,将其编码为游程符号。
3.将编码后的数据存储到文件或内存中。
4.解码时,读取存储的游程符号,恢复出原始的像素或颜色序列。
Java游程编码可以应用于多种场景,如压缩图像、视频、音频
等数据,提高数据的传输效率和存储效率。
同时,Java游程编码也
是一种常见的数据压缩算法,在数据处理和存储领域有广泛的应用。
- 1 -。
算术编码与游程编码1 .课题描述1.理解和掌握算术编码和游程编码的基本原理。
2.编程实现算术编码和游程编码的基本流程。
3.了解算术编码和游程编码的优缺点。
4.分析实验结果。
2 信源编码的相关介绍编码实质上是对信源的原始符号按一定规则进行的一种变换。
编码可分为信源编码和信道编码。
信源编码:以提高通信有效性为目的的编码。
通常通过压缩信源的冗余度来实现。
采用的一般方法是压缩每个信源符号的平均比特数或信源的码率。
即同样多的信息用较少的码率传送,使单位时间内传送的平均信息量增加,从而提高通信的有效性。
•信源编码理论是信息论的一个重要分支,其理论基础是信源编码的两个定理。
–无失真信源编码定理:是离散信源/数字信号编码的基础;–限失真信源编码定理:是连续信源/模拟信号编码的基础。
•信源编码的分类:–离散信源编码:独立信源编码,可做到无失真编码;–连续信源编码:独立信源编码,只能做到限失真信源编码;–相关信源编码:非独立信源编码。
信源编码的作用之一是设法减少码元数目和降低码元速率,即通常所说的数据压缩:作用之二是将信源的模拟信号转化成数字信号,以实现模拟信号的数字化传输。
最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。
但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。
信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。
另外,在数字电视领域,信源编码包括通用的MPEG—2编码和H.264(MPEG—Part10 AVC)编码等相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。
•3 . 算术编码3.1算术编码算法算术编码在图像数据压缩标准中扮演了重要的角色, 是无损压缩的一种算术编码中用0和1之间的实数进行编码, 该编码用到两个基本的参数Α符号的概率和它的编码间隔信源符号的概率决定了压缩编码的效率, 也决定了编码过程中信源符号的间隔, 而这些间隔包含在0到1之间 编码过程中的间隔决定了符号压缩后的输出 算术编码的编码过程如下Α算术编码把一个信源集合表示为实数线上的0 到1 之间的一个区间。
这个集合中的每个元素都要用来缩短这个区间。
信源集合的元素越多,所得到的区间就越小,当区间变小时,就需要更多的数位来表示这个区间,这就是区间作为代码的原理。
算术编码首先假设一个信源的概率模型,然后用这些概率来缩小表示信源集的区间。
]设英文元音字母采用固定模式符号概率分配如下:设编码的数据串为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 。
算术编码的算法思想如下:(1)对一组信源符号按照符号的概率从大到小排序,将[0,1)设为当前分析区间。
按信源符号的概率序列在当前分析区间划分比例间隔。
(2)检索“输入消息序列”,锁定当前消息符号(初次检索的话就是第一个消息符号)。
找到当前符号在当前分析区间的比例间隔,将此间隔作为新的当前分析区间。
并把当前分析区间的起点(即左端点)指示的数“补加”到编码输出数里。
当前消息符号指针后移。
(3)仍然按照信源符号的概率序列在当前分析区间划分比例间隔。
然后重复第二步。
直到“输入消息序列”检索完毕为止。
(4)最后的编码输出数就是编码好的数据。
3.2算术编码的特点1)不必预先定义概率模型, 自适应模式具有独特的优点;2)信源符号概率接近时, 建议使用算术编码, 这种情况下其效率高于Huffman 编码; 3)算术编码绕过了用一个特定的代码替代一个输入符号的想法, 用一个浮点输出数值代替一个流的输入符号, 较长的复杂的消息输出的数值中就需要更多的位数。
4)算术编码实现方法复杂一些, 但JPEG 成员对多幅图像的测试结果表明, 算术编码比Huffman 编码提高了5% 左右的效率, 因此在JPEG 扩展系统中用算术编码取代Huffman 编码。
4. 算术编码的C程序实现4.1 程序设计#include <iostream.h>#include<math.h>#include <stdio.h>#define M 100#define N 4class suanshu{int count,length;char number[N],n;long double chance[N],c;char code[M];long double High,Low,high,low,d;public:suanshu(){High=0;Low=0;}void get_number();void get_code();void coding();~suanshu(){}};void suanshu::get_number(){cout<<"please input the number."<<endl;for(int i=0;i<N;i++){cin>>n;number[i]=n;}cout<<"please input the chance."<<endl;for(int i=0;i<N;i++){cin>>c;chance[i]=c;}if(i==20)cout<<"the number is full."<<endl;count=i;}void suanshu::get_code(){cout<<"please input the code’s length:";cin>>length;while(length>=M){cout<<"the length is too larger,please input a smaller one."; cin>>length;}for(int i=0;i<length;i++){cin>>code[i];}}void suanshu::coding(){long double tp;//从区间取数long double x=0.0;int i,j=0;for(i=0;i<count;i++)if(code[0]==number[i]) break;while(j<i)Low+=chance[j++];d=chance[j];High=Low+d;for(i=1;i<length;i++)for(j=0;j<count;j++){if(code[i]==number[j]){if(j==0){low=Low;high=Low+chance[j]*d;High=high;d*=chance[j];}else{float chance_l=0.0;for(int k=0;k<=j-1;k++)chance_l+=chance[k];low=Low+d*chance_l;high=Low+d*(chance_l+chance[j]);Low=low;High=high;d*=chance[j];}}else continue;}cout<<"the result is:"<<Low<<high<<endl; tp=(low+high)/2.0;//取区间的中点编码printf("\n选取的小数为:%.17f\n",tp);for(j=0;j<n;j++){tp=tp*2;if(tp>1.0){tp=tp-1;code[j]=1;}elsecode[j]=0;}printf("编码为:\n");//输出编码for(i=0;i<n;i++){printf("%d",code[i]);x+=code[i]*pow(2,(-i-1));}printf("\n恢复的小数为:%.17f",x);if((x>low)&&(x<high))//判断恢复的是否成功printf("\n恢复的小数仍在允许区间\n");}int main(){suanshu a;a.get_number();a.get_code();a.coding();return 0;}4.2 运行结果3 游程编码3.1 游程编码算法编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。
行程编码因此而得名),使符号长度少于原始数据的长度。
只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。
在m元序列中,可能m种游程,连着出现m种符号ar的游程,其长度L(r)就是‘r’游程长度,这是一个随机变量。