变长码算法
1. 变长算法的VHDL建模及程序设计:按照数字图像中变长算法编码规则将输入的二进制码流进行变长算法编码。
不会呀,你能不能叫别人去做呢
2. 任意变长码的平均码长最小
平均码长=每个码长*频度。
采用只有两种码长的扩展操作码,可根据14条指令所给出的使用频度值分成两群,让使用频度较高的6条指令用3位操作码编码表示。例如,用000~101分别表示使用频度为0.15、0.15、0.14、0.13、0.12、0.11的指令的操作码。
相关知识
在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码。
这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。
3. Unicode详解
字符编码的问题,每个程序员都会遇到,深入探索其背后的原理和机制,能让我们少走很多弯路。
Unicode ( 万国码 、 国际码 、 统一码 、 单一码 )是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
Unicode发展由非营利机构统一码联盟负责,该机构致力于让Unicode方案替换既有的字符编码方案。因为既有的方案往往空间非常有限,亦不适用于多语环境。
统一码联盟在1991年首次发布了 The Unicode Standard 。
在2005年,Unicode的第十万个字符被引入成为标准之一,该字符被用于马拉雅拉姆语。
目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示2的16次(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。
最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示2的31次方个字符,完全可以涵盖一切语言所用的符号。
通用字符集 (Universal Character Set)是由ISO制定的 ISO 10646 (或称 ISO/IEC 10646 )标准所定义的标准字符集。
通用字符集包括了其他所有字符集。它保证了与其他字符集的双向兼容,即,如果你将任何文本字符串翻译到UCS格式,然后再翻译回原编码,你不会丢失任何信息。
UCS包含了已知语言的所有字符。除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的方块文字,UCS还包括大量的图形、印刷、数学、科学符号。
ISO/IEC 10646定义了一个31位的字符集。
并不是所有的系统都需要支持像组合字符这样的的先进机制。因此ISO 10646指定了如下三种实现级别:
历史上存在两个独立的尝试创立单一字符集的组织,即:
1、国际标准化组织(ISO)于1984年创建的ISO/IEC
2、统一码联盟
统一码联盟和ISO/IEC都同意保持两者标准的码表兼容,并紧密地共同调整任何未来的扩展。
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。
Unicode的实现方式称为 Unicode转换格式 (Unicode Transformation Format,简称为 UTF )。
前面说到,Unicode采用2个字节来编码文件,但是如果一个仅包含7位ASCII字符的Unicode文件,每个字符使用2字节就浪费了一般的存储空间,其第一字节的8位始终为0,这是难以忍受。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。
问题来了,UTF-8变长编码格式的出现是为了节省存储空间,变长导致了UTF-8的兼容性相应降低。
类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。
也就是说,UTF-16是为未来准备的变长编码格式。
还有就是,在Mac和普通PC上,对于字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如某字符为十六进制编码4E59,按两个字节拆分为4E和59,在Mac上读取时是从低字节开始,那么在Mac OS会认为此4E59编码为594E,找到的字符为“奎”,而在Windows上从高字节开始读取,则编码为U+4E59的字符为“乙”。就是说在Windows下以UTF-16编码保存一个字符“乙”,在Mac OS环境下打开会显示成“奎”。此类情况说明UTF-16的编码顺序若不加以人为定义就可能发生混淆。
于是在UTF-16编码实现方式中使用了 大端序 (Big-Endian,简写为UTF-16 BE)、 小端序 (Little-Endian,简写为UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案,目前在PC机上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。目前在PC机上的Windows系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。
在Windows XP附带的记事本,“另存为”对话框可以选择的四种编码方式除去非Unicode编码的ANSI(对于英文系统即ASCII编码),中文系统则为GB2312或Big5外,其余三种为“Unicode”(对应UTF-16 LE)、“Unicode big endian”(对应UTF-16 BE)和“UTF-8”。
UTF-8,是我们最经常看到的编码格式之一。前面已经简单介绍过,这是一种变长编码格式,变长的目的是节省存储空间。
UTF-8使用一至六个字节为每个字符编码(2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节)。
下面介绍其编码规则:
1、128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
2、带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文等则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
3、其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
4、其他极少使用的Unicode 辅助平面的字符使用四至六字节编码。(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
对上述提及的第四种字符而言,UTF-8使用四至六个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字符都可以用三个字节表示,而且它的另一种选择,UTF-16编码,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字符的分布范围而定。
下面来看看UTF-8具体怎么编码各种类型的字符:
1、单字节编码,字节由零开始:0zzzzzzz。(z取值0或1,下同)
2、两字节编码:(110yyyyy 10zzzzzz)第一个字节由110开始,接着的字节由10开始
3、三字节编码:(01110xxxx10yyyyyy 10zzzzzz)第一个字节由1110开始,接着的字节由10开始。
4、四字节编码:(11110www 10xxxxxx 10yyyyyy 10zzzzzz)将由11110开始,接着的字节由10开始
UTF-16 是Unicode字符编码五层次模型的第三层:字符编码表。即把Unicode字符集的抽象码位映射为16位长的整数,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
Unicode的编码空间从U+0000到+10FFFF,共有1,112,064个码位(code point)可用来映射字符. Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从0016到1016,共计17个平面。第一个平面称为 基本多语言平面 (Basic Multilingual Plane, BMP ),或称第零平面(Plane 0)。其他平面称为 辅助平面 (Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。
分平面来介绍UTF-16的实现方式:
1、第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。该平面被称为基本多语言平面,缩写为 BMP (Basic Multilingual Plane, BMP)。UTF-16与 UCS-2 编码这个范围内的码位为16比特长的单个码元,数值等价于对应的码位. BMP中的这些码位是仅有的可以在UCS-2中表示的码位.
2、辅助平面(Supplementary Planes)中的码位,在UTF-16中被编码为 一对 16比特长的码元(即32bit,4Bytes),称作 代理对 (surrogate pair),具体方法是:
算法可理解为:辅助平面中的码位从U+10000到U+10FFFF,共计FFFFF个,即220
=1,048,576个,需要20位来表示。如果用两个16位长的整数组成的序列来表示,第一个整数(称为前导代理)要容纳上述20位的前10位,第二个整数(称为后尾代理)容纳上述20位的后10位。还要能根据16位整数的值直接判明属于前导整数代理的值的范围(210=1024),还是后尾整数代理的值的范围(也是210
=1024)。因此,需要在基本多语言平面中保留不对应于Unicode字符的2048个码位,就足以容纳前导代理与后尾代理所需要的编码空间。这对于基本多语言平面总计65536个码位来说,仅占3.125%.
3、Unicode标准规定U+D800..U+DFFF的值不对应于任何字符.
参考资料:
https://zh.wikipedia.org/wiki/Unicode
https://zh.wikipedia.org/wiki/UTF-8
https://zh.wikipedia.org/wiki/UTF-16
4. 中国鞋码的换算公式
换算公式:多少厘米*2-10=多少码
例如:220鞋码是34码;225鞋码是35码;230鞋码是36码;235鞋码是37码;240鞋码是38码;245鞋码是39码;250鞋码是40码。详情见下表:
(4)变长码算法扩展阅读:
鞋码通常也称鞋号,是用来衡量人类脚的形状以便配鞋的标准单位系统。
2013年世界各国采用的鞋码并不一致,但一般都包含长、宽两个测量。长度是指穿者脚的长度,也可以是制造者的鞋楦长。即使在同一个国家/地区,不同人群和不同用途的鞋,例如儿童、运动鞋,也有不同的鞋码定义。
脚长指最长脚趾顶点到脚后跟突点间的水平直线距离。 注意不要直接量脚,直接量会出现很大的误差,而要使用白纸,把脚踩在白纸上,沿着脚用笔在白纸上画出脚的四周,或者在脚的前端和后端分别做标记;根据所画的脚图测量长度,便是脚长。
脚围指的是脚的宽度,是指拇指球到尾趾根部的垂直距离。将脚轻踩在纸上描出轮廓形状(笔呈90度垂直),再量脚型的长与宽,对照以下的数据表一般来说都是以脚长为主来判断尺寸。
5. 什么叫误码扩散度
咨询记录 · 回答于2021-10-09
6. 定长编码怎样确定码长
定长编码确定码长的方法是:通过ASCII编码来实现的,因为定长仅表明段与段之间长度相同,但没说明是多长。有了ASCII编码这一基本单位,我们就可以说得更具体,如定长一字节或者定长二字节。
假设我们现在有个文件,内容是00000001,假如定长2位(这里的位指十进制的位)是唯一的编码方案,用它去解码,就会得到“hhhe”(可以对比图上的编码,00代表h,所以前6个0转化成3个h,后面的01则转化成e)。
定长多字节方案是如何来的:其实变长多字节方案更早出现,比如GB2312,采用变长主要为了兼容一字节的ASCII,汉字则用两字节表示。随着计算机在全世界的推广,各种编码方案都出来了,彼此之间的转换也带来了诸多的问题。
编码的定义是:
1、固定长度的码,码中所有码字的长度都相同。
2、可变长度码,码中的码字长短不一就是变长码。
奇异码和非奇异码:若信源符号和码字是一一对应的,则该码为非奇异码。反之为奇异码。
唯一可译码和非唯一可译码:唯一可译码:任意有限长的码元序列,只能被唯一地分割成一个个的码字,便称为唯一可译码。
非即时码:如果接收端收到一个完整的码字后,不能立即译码,还需等下一个码字开始接收后才能判断是否可以译码。
即时码:只要收到符号就表示该码字已完整,可以立即译码。
即时码的条件:设W1=Wi1Wi2…WiL为一个码字,对于任意的1≤j≤l,称码符号序列的前j个元素Wi1Wi2… Wij为码字的前缀。
7. 哈夫曼编码码长怎么算
假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}。
哈夫曼编码 根据上面可得编码表: a:1001 b:01 c:10111 d:1010 e:11 f:10110 g:00 h:1000
用三位二进行数进行的等长编码平均长度为3,而根据哈夫曼树编码的平均码长为:4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61 2.61/3=0.87=87%其平均码长是等长码的87%,所以平均压缩率为13%。
因为定长编码已经用相同的位数这个条件保证了任一个字符的编码都不会成为其它编码的前缀,所以这种情况只会出现在变长编码当中,要想避免这种情况,
就必须用一个条件来制约定长编码,这个条件就是要想成为压缩编码,变长编码就必须是前缀编码,所谓的前缀编码就是任何一个字符的编码都不能是另一个字符编码的前缀。
(7)变长码算法扩展阅读:
实际应用中,除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,
例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。按照CCITT标准,需要统计2×1728种游程(长度),
这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。其中q称主码,r为基码。编码时,不小于64的游程长度由主码和基码组成。而当l为64的整数倍时,只用主码的代码,已不存在基码的代码。
8. 哈夫曼编码码长怎么算
设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。
霍夫曼编码是变长编码,思路:对概率大的编的码字短,概率小的编的码字长,这样一来所编的总码长就小,这样编码效率就高。上面那样求是不对的,除非你这6个码字是等概率的,各占1/6。应该用对应的概率*其对应得码长,再求和。
实际应用中
除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。
按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。
9. Unicode字符集的UTF-32、UTF-16和UTF-8编码
什么是Unicode字符集?简单地说,它就是把全世界人类发明和使用的现有的所有字符进行了集中收集和逐一编码,这个过程就像把上学时老师把班里学生都叫到一起,统计总数后给每个学生分配一个唯一的学号一样。Unicode字符集里收录的字符可以是文字(如:‘α’、‘魍’等),也可以是符号(如:‘@’、‘$’),还可以是图形(如'☺'等)。
那它有什么用呢?它有两个重要的用途:
一是解决了人们和机器之间的字符交互问题。每个字符不再是一个个抽象的文字、符号或图形,而是变成了一个个的数字,每个数字对应一个唯一的字符,而每个字符也有一个唯一的数字,两者之间是一一对应关系,而且不同字符和不同数字都各不相同,避免了“重名重姓”问题。这里,提到的表示字符的数字,我们也称之为 码点 ,后面我们还会详细介绍。
二是解决了不用语言国家字符集编码不统一的问题,提供了一个统一的编码方式,避免“各自为政,政出多门”的问题,方便相互之间的数据交流。
有了基本概念,那么我们看看Unicode字符集是如何实现对所有字符编码的。根据官网公布的Unicode 最新版本(9.0)介绍,Unicode字符集现在共包括 128,172 个字符,可查看 http://www.unicode.org/versions/Unicode9.0.0/ 。如此大量的字符,该如何编码?最笨的办法就是把所有字符列出来,然后一个一个编个号,但这样不利于查找,也不利于分类,更不利于进行存储空间优化编码(后面会介绍一些优化编码方案)。
那Unicode字符集怎么解决这个编码问题呢?它采用的是“分块编码”。按照国籍、地区、用途、功能等不同属性,把字符先进行分类,然后再根据每个小字符类的字符个数,确定一个个大小不同的 码块 ,下面节选了几种字符及其对应的 码点 。
(节选)
0000..007F; Basic Latin(基本拉丁字母)
4E00..9FFF; CJK Unified Ideographs(CJK统一表意文字)
1D100..1D1FF; Musical Symbols(音乐符号)
100000..10FFFF; Supplementary Private Use Area-B(补充专用区域-B)
注意,“0000”、“007F”、“1D100”以及“100000”等,都是十六进制,这是每个字符在Unicode字符集中的编号,也就是相当于每个字符的“学号”。
可以看出,要表示一个字符,最长需要6位十六进制数,换算一下就是24位二进制数;而短的,比如基本拉丁字母,前面的“0”省去,只要2位十六进制(8位二进制数)就行了。
有了字符集,下面就要谈谈如何表示和使用这些字符(码点)了。毕竟,谁也不会闲了没事把字符编个号就为了练自己认字和数数的能力。 最重要的当然是为了让不同信息受体间交换信息 。
于是,就出现了UTF。所谓UTF是Unicode Transformation Format的缩写,意为Unicode转换格式。UTF具体分为3类,分别是UTF-32,UTF-16和UTF-8。
先看UTF-32。UTF-32是 定长编码 ,也就是说每个字符的编码长度都是固定的,‘32‘是其所使用的二进制编码的位数,即: 32位 。但通常以字节数进行量化,所以32位对应的字节数为 4字节 。
我们的Unicode字符集每个字符的码点最长也就是24位,相当于3个字节,而UTF-32给了4个字节(32位)来表示,给了字符集非常大的扩展空间(有兴趣的童鞋可以算算32位二进制数最大可以表示多大的数,这个数基本就对应了可以表示多少字符)。
没这时间计算这些的童鞋你就简单理解为,UTF-32就是一个“运超大箱”的快递公司,不管你寄什么,它都统一拿装冰箱的盒子寄(觉得不够大的,自行脑补一个),保证能一次装下你要寄的东西。
它的优点是被表示的Unicode字符都是固定长度的,易于查找和解码;但缺点是表示常用字符时内存占用太大,本地存储利用率或传输效率太低。
UTF-16是 变长编码 ,也就是说每个字符的编码长度是变化的,不是一成不变的。它的编码算法为:
在UTF-16中,2字节是字符的基本表示单元,低码点的用 2字节 表示,高码点的拆开后用 2个2字节 表示。
还是拿快递公司的例子类比,UTF-16是家提供了一种“运中等箱子”的快递公司,中等箱子能装下的就直接寄,装不下的,做个标记,分两个箱子寄,收件人需要特别注意下标记,如果没有标记,直接就用,如果有,就把两个箱子东西取出来拼起来后再用。
UTF-8也是 变长编码 ,它的编码算法与UTF-16并无本质区别,都是对Unicode进行分段,然后加上标识码,唯一的区别是分段更多。其算法如下:
在UTF-8中,1字节是字符的基本表示单元,最低的码点( 000000-0000FF )用1字节表示,高的码点( 000080-10FFFF )进一步分段,分别拆开为2个、3个和4个1字节。
可见,相比较而言,UTF-8是家只能“运小箱子”的快递公司,少数能装下的就用1个箱子运,不能装下的就拿2个、3个甚至4个来运。作为收件人,会非常辛苦的进行逐一判别,基本上都是需要拆箱组装后才能使用的(下面讲到也会有特例)。
当然,UTF-8在对于拉丁语系国家或者字符为主的信息传递和数据处理时,效率是非常高的,因为刚才Unicode字符集节选中提到的基本拉丁语范围刚好是 0000..007F ,在UTF-8中只要1个字节就够了。但是,对于中日韩(CJK,China-Japan-Korea)语系或字符为主的信息传递和数据处理时,效率就不那么好了,因为刚才节选的中日韩表意文字范围是 4E00..9FFF ,那在UTF-8中进行编解码时必须按照上面UTF-8算法的 第3条 进行处理,也就是要用 3个字节 来表示(还不如UTF-16的 2字节 ),所以国内很多中文数据较多的网站一般也不会采用UTF-8来进行编码,但作为程序猿还是比较喜欢用这种的编码方式。
完。
10. 什么是变字长最佳编码原理
哈夫曼编码(Huffman Coding),又称霍夫曼编码
最佳编码定理:在变字长码中,对于出现概率大的信息符号编以短字长的码;对于出现概率小的信息符号编以长字长的码,如果码字长度严格按照符号概率的大小的相反顺序排列,则平均码字长度一定小于按任何其他符号顺序排列方式得到的码字长度。
Huffman编码步骤:
概率统计,得到n个不同概率的信号;
将n个信源信息符号的n个概率,按概率大小排序;
将最后两个小概率相加,概率个数减为n-1;
将n-1个概率重新排序;
再将最后两个小概率相加,概率个数减为n-2;
如此反复n-2次,得到只剩两个概率序列;
以二进制码元(0,1)赋值,构成Huffman码字。