改进的霍夫曼数据压缩方法

文档序号:6475308阅读:393来源:国知局
专利名称:改进的霍夫曼数据压缩方法
很多数字通信系统以分组的形式发送数据。这些分组包括在数据开始部分的报头。所述的报头包括的信息涉及例如分组的目的地地址,分组的长度和其中包括有效负荷数据的类型。报头可以认为是一个包括一个比特串的长字符。
移动电信网和因特网从功能上讲正在融合。对于第三代移动手机来讲,希望直接了解因特网(IP或ATM)数据分组以便允许移动用户得到无缝电子邮件、网页浏览和多媒体服务。例如IP等协议其目的是在带宽丰富的固定网络上运行,因此它们在移动电话环境中是很贵的。当用于传送语言时,使用IP产生的开销可以达到网络容量总数的75%,对于移动网络来讲这是不能接受的。
这个问题的一个解决方案是在它通过空中接口之前压缩IP报头。一些为了达到这个目的压缩方案(范杰克布森(Van Jacobson),CRTP等等),在效率、灵活性和简单性之间进行了不同地权衡。
本发明的一个目的是提供一个用于二进制(或其它)数据单元的报头和字符的压缩和随后的解压缩的改进方法。
发明人确定了一种改进数字数据压缩的方法,它在连续的数据块中利用行为模式检测,它有效率的对数据进行压缩。行为模式定义为任何非随机性的形式并且可以采用任何适当形式例如,重复、计数器加1计数、或在少量值之间的数据块交换。
公知的数据压缩系统包括霍夫曼算法。这个公众可用的标准被广泛用于很多的压缩方案中,包括“WinZip”。霍夫曼编码压缩数据流一次一个字符,其中一个字符通常是一个字节。基本的压缩不是非常有效率,但是可以通过应用递归方法或增加一个字符的大小而获得良好的效果。然而,这个增加了算法的处理与/或存储器需求。
本发明人已经开发了一个改进型的霍夫曼方法,同普通的霍夫曼方法相比显著地降低了存储器需求,允许增加一个字符的大小并且因此提供一个更好的压缩比。
为了了解本发明,现在对现有技术进行说明。
普通的霍夫曼算法霍夫曼编码是应用在诸如″WinZip″的很多流行的压缩方案中的公众可用的压缩标准。所有的霍夫曼压缩程序都工作在字符流上(例如ASCII字符)。基本思想是创建一套新的压缩字符或代码,每个标准字符映射到一个压缩字符,反之亦然。经常发生的是通用字符被给予比很少使用的字符更短的压缩码,以减少数据流的平均大小。压缩比可以通过增加一个字符的大小被改进,但是要以较高的存储器需求为代价。实际上,在运行一个霍夫曼压缩程序时使用的存储器随字符大小指数级的增长,因此16位字符需要的存储器是8位字符的256倍。


图1说明了普通的霍夫曼如何工作。在这个例子中,它涉及10个不同的可能字符(一组10个ASCII字符)如单引号中所示(通常一个字符可以是任意的,例如一个字节、一个报头、一个ASCII字符等等)。要知道的对于字符的一个必要条件是该字符在数据序列中出现的近似概率,本领域技术人员可以理解,可以以任何的适当的方法实现上述必要条件(例如一个较大的字符流被获取并且确定每个字符出现的频繁程度)。
在这个操作例子中,普通的霍夫曼树需要10个起始节点,一个对应于每个可能的字符。这些节点被标绘在霍夫曼树顶点上,连同这个字符在一个未压缩的数据流中出现的百分比概率。字符通常根据渐增的概率被排序。空格字符是很通用的字符并且被放在最后。如图所示,在每个字符下面的框显示它出现概率。为了构造树,具有最小概率的两个节点相连形成一个新的节点。左侧分支用“1”标记,右侧分支用″0″标记。新节点由组合的根节点的概率获得(在第一种情况下是6%)。这个处理将持续到只剩下一个节点,在这个点,树创建结束。通常,概率最小的分支用’1’标记,第二小的用’0’标记。这两个概率的和被给予新的节点。用于这个操作例子的完成的霍夫曼树的如下所示为了压缩一个字符,在恰当的节点开始并且沿着树向下,读出它们遇到的“1”和“0”。这样产生的比特串是压缩过了的字符。例如“E”,沿着树到它的根;这里给出的是0001。因此E由0001表示。
压缩字符有时倒着写,这样E由1000表示。这样使它易于解压缩(因为我们可以从左至右读取压缩过的字符沿着树向上)。
类似地,为了解压缩一个字符,只要沿着树向上,使用压缩过的比特串来判断在每个节点是向左分支还是向右分支。最后,将到达原始的十个节点中的一个并且发现正确的解压缩字符。
可以看到,通用字符由较少的二进制比特表示;一个“空格”字符在此由0表示。
改进的霍夫曼算法在一个公知的根据霍夫曼算法的压缩字符流的改进方法中,每个字符被分配给一个组,并且这些组被认为是传统的霍夫曼算法字符。这个方法与普通的霍夫曼算法相比显著地降低存储器需求,允许增加一个字符的大小并且因此给定的一个更好的压缩比。改进的霍夫曼编码方法还运用一个″字符组″而不是字符本身来构造树;所述的组有效地成为普通霍夫曼算法的字符。
改进的霍夫曼树的构造分为两个阶段。在第一阶段,根据一个通用的行为模式,字符被分割成组。一个行为模式可以是例如相同的概率,因此,字符根据他们的相对频率被分组。
然而问题是,在一个压缩的字符中,这组的霍夫曼编码必须跟随一个位模式,该位模式识别该组内的哪个字符已经被压缩。如果该组不包括2的乘方个字符,那么位模式被浪费,给出的压缩效率很差。发明人已经确定了解决这个问题的方法。
本发明包括一个通过确定特定于一个字符的总代码来压缩这个字符的方法,包括如下步骤a)根据一个通用的行为模式对字符分组;b)当组内字符的数量是奇数时,创建两个新的字符组,一个新组仅仅包括一个字符,另一个新组包括其余字符;c)对于每个来自步骤b)的新组以及来自步骤a)的具有偶数个字符的所述组,分配一个组特定代码;d)当在步骤c)中涉及的组内的字符不止一个的时候,分配一个字符标识符代码来识别组内的单独字符;e)总字符代码包括连接在一起的组特定和标识符代码。
现在将参考例子更详细地描述本发明。
例子1一个本发明遵循的简单的基本的例子现在将参考图2被说明。在示出的例子中有4个组或行为模式。组A包括3%概率出现的所有字符,即′B′、′C′、′1′和′2′。并且另外一个组,根据遇到该字符的概率被建立组B包括字符′A′、′E′和′?′。组C包括′D′和′$′,最后组D仅包括空格字符。
树最初从每个组的一个节点开始(总共4个)。节点被利用在组中字符的数量以及在组中的一个字符出现在一个字符随机流中的概率来标记。
为了构造树,有三个可能的操作。在组中偶数个字符的位置放置一个节点;这个节点被给定为两倍概率,但是新节点的计数器显示为字符数的一半。节点被分配一个可变的字符″X″,根据组中的哪个字符将被选取压缩来随后填写″X″。每次进一步向树的根节点移动的时候,创建一个新节点;概率加倍而且计数器中单元的个数减半。当用树来压缩数据时,所述的″X″已依据哪个字符出现而被填写。不是在树的最顶端得到多个分支,而是得到单一的轨迹和一个标识符的小排列。
例如,为了解压缩这个数据,字符编码是101011,1向左,0向左,1向左。然后知道它的B、C、1或2-最后2位将告知它是哪个字符。
实际上,压缩码包括两个部分;一部分包括识别组的代码,也就是组代码。此外,就象霍夫曼组那样,例如包括很少出现的字符的组,具有比用通用字符的组更长的组代码。压缩码的另一个部分包括标识符代码,它是用于将它与组内其它字符进行区分的代码。具有奇数个字符的组分成两个组;一个字符的移动会产生一个具有偶数个字符的新组并且新组仅包括一个移动的字符。
如果在一个组中有奇数个字符,则该组被分成两个节点。一个分支仅表示所述字符中的一个;另一分支表示所有其它字符并且现在表示具有偶数个字符的集合。改进的霍夫曼编码树,在没有分支的节点处,实际包括作为标识符的额外符号′X′。在具有奇数成员的组有分支的地方,就有一个标识符″D″,或为0或为1来表示哪个分支是在上述的分离之后的分支,例如,如果″D″的值是1,这表示这样一个分支,它表示从组中被删除以便提供偶数编号组的字符,如果″D″的值是″0″表示新偶数编号的组。
符号′D′用来将组分离成两个新组。因为每个新组都具有它自己的组标识符,不必将将0和1分配给符号′D′。在原来和新的偶数组中的标识符′X′标识偶数组内的字符。
如上述提及的,发明人已经确定为了优化效率,可以将一个节点分离成两个节点,这被使用一个单独的数字标识符来表示。在这个规范中,我们将它称为″D″。
″X″和″D″实际上是验证码的数字并且用于区别具有相同的状态模式的任意两个字符。压缩的初始步骤是用唯一的标识号标记每个字符,所述的唯一的标识号可以将它与具有相同的行为模式的其它字符进行区分。
创建改进的霍夫曼算法树的一般的方法如下查找具有最小概率的节点。假设这个节点包括n个字符。下一步取决于n的值1)如果n是偶数,则创建一个具有双倍概率且具有n个字符一半数目的新节点。将这个新节点连接到一个旧节点,并且用′X′标记该分支。
2)如果n是奇数并且n>1,则创建两个概率相同的新节点,左边的那个包括n-1个字符并且右边的一个包括1个字符。将这些新节点连接到旧节点,并且用′D′标记该分支。
3)如果n=1,则查找具有第二最小概率的节点。假设这个节点包括m个字符。
a)如果m>1,则创建两个概率相同的新节点,一个包括m-1个字符且另一个包括1个字符。将这个新节点连接到旧节点,并且用′D′标记该分支。
b)现在有了一个具有最小概率的节点和具有第二最小概率的节点,两者包括一个字符。把这些节点连接起来形成一个包括一个字符的新节点。用′1′标记具有最小概率的分支并且用′0′标记第二最小概率的分支。将两个概率的和放置在新节点中。
为了压缩和解压缩,在一个组中的每个字符应该用集合{0,1,2…}中的唯一的标识数字标记。这用于区别相同的组中的两个字符。
假定将被压缩的字符具有唯一标识符i。在树上查找正确的行为模式并且沿着树向下,在每个节点进行这些步骤1)如果节点具有一个′0′或′1′分支,则将该比特增加到压缩比特的串。
2)如果标签是′X′,则将i的最低有效位增加到压缩比特的串。然后用i除以2(下舍入)。
3)对于标签′D′,如果i是0,沿着分支向右。否则,i减1并且沿着分支向左。
所得到的比特串就是压缩的字符。解压缩只不过是将这个过程颠倒,用压缩的比特沿着树回到正确的行为模式。唯一标识符i最初应当设置为0,并且通过在每个节点的下列步骤重新构建1)如果节点有分支,则用压缩串中相应的比特确定跟随哪个分支。
2)如果到达′X′,则将i乘2,然后如果相应的压缩比特也是′1′,则i加1。
3)如果到达了左侧″D″分支,则i加1。
可以看到,两种方法之间的不同之处是,普通的霍夫曼编码需要用于每个字符的单独节点。
权利要求
1.一个通过确定特定于一个字符的总代码来压缩该字符的方法,包括如下步骤a)根据一个通用的行为模式对字符分组;b)当组内字符的数量是奇数时,创建两个新的字符组,一个新组仅仅包括一个字符,另一个新组包括其余字符;c)对于每个来自步骤b)的新组以及来自步骤a)的具有偶数个字符的所述组,分配一个组特定代码;d)当在步骤c)中涉及的组内的字符不止一个的时候,分配一个字符标识符代码来识别组内的单独字符;e)总字符代码由连接在一起的组特定和标识符代码构成。
2.如权利要求1所述的方法,其中所述的组代码的大小通常根据单元出现的概率被排序。
3.如权利要求2所述的方法,其中的步骤包括用以下步骤实现压缩树的步骤i)将所述的数据单元排列成具有通用行为的组,并且将这些组作为节点排列;ii)通过以下步骤创建初步的组末端节点a)对于每个节点来说,如果组内字符的数目n是偶数,则创建一个具有双倍概率但是仅为字符数量n的一半的新节点并且将这个新节点连接到旧节点,用一个单独的标识符′X′标记分支,并且重复直到节点中字符的数目是1;b)如果n是奇数并且n>1,则创建两个概率相同的新节点,一个包括n-1字符并且在右边的那个包括1个字符,并将这些新节点连接到旧节点,用标识符′D′标记该分支;c)对于包括n-1个字符的节点则创建一个具有字符数量一半的新节点并且将这个新节点连接到旧节点,并且用单独的标识符′X′标记分支并且重复直到节点中的字符数目是1;iii)将所述的初级末端节点一次一对地连接在一起,并且用″1″或″0″标记每个路径,直到产生一个单独的节点;iv)通过确定包括表示到组终端节点路径的“1”或“0”的串的一个组特定代码和通过标识符串表示的一个字符特定代码来计算压缩的二进制字符;v)连接在一起的组特定代码和标识符代码。
4.如权利要求1所述的方法,其中所述的行为模式是一个通用概率(范围)。
5.如权利要求所述的方法,在其中的步骤中,标识符代码是最小尺寸,以便虑及在将被明确分配到的组里出现的每个单元。
6.如权利要求1或2所述的方法,其中标识符代码包括所述字符本身。
7.如前述任何权利要求所述的方法,其中所述的字符是报头。
全文摘要
一种通过确定特定于字符的总代码的字符压缩方法,包括如下步骤a)根据一个通用的行为模式对字符分组;b)当组内字符的数量是奇数时,创建两个新的字符组,一个新组仅仅包括一个字符,另一个新组包括其余字符;c)对于每个来自步骤b)的新组以及来自步骤a)的具有偶数个字符的所述组,分配一个组特定代码;d)当在步骤c)中涉及的组内的字符不止一个的时候,分配一个字符标识符代码来识别组内的单独字符;e)总字符代码包括连接在一起的组特定和标识符代码。
文档编号G06T9/00GK1478255SQ01819559
公开日2004年2月25日 申请日期2001年5月1日 优先权日2000年9月28日
发明者R·普里斯, R 普里斯 申请人:罗克马诺尔研究有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1