本发明涉及编码领域,具体而言,涉及一种编码方法和装置。
背景技术:
哈夫曼编码(huffmancoding)是一种编码方式,是可变字长编码(vlc)的一种。huffman于1952年提出该编码方法,该方法对于出现次数较多的符号使用较短的编码表示,对于出现次数较少的符号使用较长的编码表示,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的。哈夫曼算法需要扫描两遍数据。第一遍扫描计算符号在数据中出现的频数,然后根据符号频数构建一颗哈夫曼树,第二次扫描数据将符号按哈夫曼树进行编码。
构建哈夫曼树的计算方法如下:首先建立一个n个字符组成的编码字符集,保存其字符标志及每个字符的频数f,以f值的大小进行排序构成优先队列q,2棵具有最小概率的数进行合并。一旦2棵具有最小概率的树合并后,产生一个新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列q。经过n-1次的合并后,优先队列中只剩下一棵树,即所要求的哈夫曼树。构建哈夫曼树后即可以对这棵哈夫曼树按照左0右1的分配方案进行编码。常规的哈夫曼树建立方法其时间复杂度为o(n^2)。
下面以图1为例对现有技术中哈夫曼树的构造过程进行说明。六个编码符号a、b、c、d、e、f根据其出现的频数由小至大排序为:“f:5、e:9、c:12、b:13、d:16、a:45”,首先将f和e合并得到14,将14插入队列中的b和d之间;将c和b合并得到25,将25插入队列中的d和a之间;将14和d合并得到30,将30插入到队列中的25和a之间;将25和30合并得到55,将55排在a之后,最终将a和55合并为100。然后对这棵哈夫曼树按照左0右1的分配方案对其进行编码。
在哈夫曼编码算法中引入堆排序思想可以较大幅度的减少运算量,避免重复性的比较。若采用最小堆排序,则寻找最小节点的时间复杂度变为o(logn),整体的复杂度就减少为o(nlogn)。但即使哈夫曼编码采用了堆排序思想,但当n比较大时排序运算仍会较耗较长的时间,从而使得哈夫曼树建立较慢,影响编码的速度。
针对现有技术中哈夫曼树建立较慢,导致编码速度慢的问题,目前尚未提出有效的解决方案。
技术实现要素:
本发明实施例提供了一种编码方法和装置,以至少解决现有技术中哈夫曼树建立较慢,导致编码速度慢的技术问题。
根据本发明实施例的一个方面,提供了一种编码方法,包括:获取待编码数据中每个编码符号出现的概率;根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层;按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树;根据编码树编码待编码数据。
进一步地,获取每个编码符号出现的频次和待编码数据中所有编码符号的数量;根据每个编码符号出现的频次和待编码数据中所有编码符号的数量确定每个编码符号的出现的概率。
进一步地,确定概率范围以及概率范围对应的层,其中,概率范围包括:
进一步地,当当前层中编码符号的数量为偶数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,并在父节点满足预设上升条件的情况下,将父节点上升至上一层;当当前层中编码符号的数量为奇数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,在父节点满足预设上升条件的情况下并将父节点上升至上一层,并将剩余的一个单一编码符号直接上升至上一层的最前端。
进一步地,父节点对应的概率属于上一层对应的概率范围。
进一步地,将父节点对应的概率与上一层中最大的概率进行比较;如果父节点对应的概率大于上一层中最大的概率,则将父节点置于上一层的最末端,将上一层中最大的概率置于上一层中的最前端;如果父节点对应的概率小于上一层中最大的概率,则将父节点置于上一层的最前端。
进一步地,如果父节点对应的概率大于当前层中最大的概率,则将父节点与当前层的最大概率对应的节点更换位置;如果父节点对应的概率小于当前层中最大的概率,则保持父节点当前所处的位置。
进一步地,在将父节点保留在当前层,并与当前层中最大的概率进行比较之后,方法还包括:将父节点作为当前层的编码符号,与其他编码符号的概率进行合并。
进一步地,添加编码长度空间和编码流空间,其中,编码长度空间用于保存每个编码符号的编码长度,编码流空间用于保存每个编码符号的编码流信息。
进一步地,在分层后的每个编码符号对应的单元中存储单元下辖所有子叶子的标识,其中,标识用于表征每个单元的下辖分支是否包括待编码的编码符号。
进一步地,对于位于父节点左侧的子节点,对子节点下辖的编码符号的最底端的编码长度加一,并在已有的编码码流前添加零编码;对位于父节点右侧的子节点中最底端的节点的编码长度加一,并在已有的编码码流前添加一编码。
根据本发明实施例的另一方面,还提供了一种编码装置,包括:获取模块,用于获取待编码数据中每个编码符号出现的概率;分层模块,用于根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层;构建编码树模块,用于按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树;编码模块,用于根据编码树编码待编码数据。
进一步地,获取模块包括:获取子模块,用于获取每个编码符号出现的频次和待编码数据中所有编码符号的数量;第一确定子模块,用于根据每个编码符号出现的频次和待编码数据中所有编码符号的数量确定每个编码符号的出现的概率。
进一步地,分层模块包括:第二确定子模块,用于确定概率范围以及概率范围对应的层,其中,概率范围包括:
根据本发明实施例的另一方面,还提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述任意一项编码方法。
根据本发明实施例的另一方面,还提供了一种处理器,其特征在于,处理器用于运行程序,其中,程序运行时执行上述任意一项编码方法。
在本发明实施例中,获取待编码数据中每个编码符号出现的概率,根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层,按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树,根据编码树编码待编码数据。上述方案提供的编码方法方法仍需要扫描计算编码符号在待编码数据中出现的频数来构建近似最优二叉树,但在构建编码二叉树上时无需对编码符号出现的概率进行排序,节省了现有技术中哈夫曼编码在建立二叉树时需要对编码符号出现的概率进行排序的过程,构建近似最优二叉树的整体复杂度仅为o(n),且编码压缩率和哈夫曼编码接近,从而解决了现有技术中哈夫曼树建立较慢,导致编码速度慢的技术问题,达到了提高无损压缩速度的效果。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据现有技术的一种哈夫曼编码的示意图;
图2是根据本发明实施例的一种编码方法的流程图;
图3是根据本发明实施例的一种可选的编码方法的流程图;
图4是根据本发明实施例的一种应用实施例1中的编码方法进行编码的示意图;
图5a是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;
图5b是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;
图5c是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;
图5d是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;
图5e是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;
图5f是根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图;以及
图6是根据本发明实施例的一种编码装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例1
根据本发明实施例,提供了一种编码方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图2是一种根据本发明实施例的编码方法的流程图,如图2所示,该方法包括如下步骤:
步骤s202,获取待编码数据中每个编码符号出现的概率。
作为一种可选的实施例,获取待编码数据中每个编码符号的出现的概率,包括:获取每个编码符号出现的频次和待编码数据中所有编码符号的数量;根据每个编码符号出现的频次和待编码数据中所有编码符号的数量确定每个编码符号的出现的概率。
步骤s204,根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层。此处需要说明的是,符合概率范围的才被划分至对应的层,因此在对概率进行分层得到的结果中,某层可能为0个,即不包含概率属于该层的编码符号。
具体的,在上述步骤中,上述每层对应的概率范围都不相同,且没有重合区域。
作为一种可选的实施例,根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层,包括:确定概率范围以及概率范围对应的层,其中,概率范围包括:
在一种可选的实施例中,第一层对应的概率范围为[1/2,1),第二层对应的概率范围为[1/4,1/2),第三层对应的概率范围为[1/8,1/4),按照上述规律继续进行分层,直至概率最小且概率非零的编码符号能够落入最大层m层内。另外,还可以限定最大层数,并将最小的编码概率值改为第k层的概率最小值。
采用该分层方法,算法的编码符号的最大编码长度为k。由此可知,同一层的编码量化值概率相近,且任意两个第n层的概率值相加,合并后的值必然能够上升到上一层。每一层编码符号的概率最大值放在该层的最后。
步骤s206,按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树。
具体的,顶层为[1/2,1)的概率范围对应的层,在执行合并及层的晋升后,该层必然会存在两个节点,将这两个节点合并,则能够得到最终用于编码的二叉树,因此,每个概率范围不重合。
在一种可选的实施例中,由分层后的底层开始,两两相加上升至上一层,作为上一层中的节点,与上一层的编码符号的频率再进行两两相加,直至上升至顶层。在层中的编码符号的数量为奇数,不能与其他编码符号的概率结合时,直接将这个单独的编码符号的概率上升至上一层。
步骤s208,根据编码树编码待编码数据。
具体的,上述编码树为二叉树,根据最终的二叉树对待编码数据进行编码。
由上可知,本申请上述实施例获取待编码数据中每个编码符号出现的概率,根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层,按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树,根据编码树编码待编码数据。上述方案提供的编码方法方法仍需要扫描计算编码符号在待编码数据中出现的频数来构建近似最优二叉树,但在构建编码二叉树上时无需对编码符号出现的概率进行排序,节省了现有技术中哈夫曼编码在建立二叉树时需要对编码符号出现的概率进行排序的过程,构建近似最优二叉树的整体复杂度仅为o(n),且编码压缩率和哈夫曼编码接近,从而解决了现有技术中哈夫曼树建立较慢,导致编码速度慢的技术问题,达到了提高无损压缩速度的效果。
可选的,根据本申请上述实施例,按照概率范围由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至最大概率范围对应的层,得到待编码数据的编码树,包括:
当当前层中编码符号的数量为偶数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,并在父节点满足预设上升条件的情况下,将父节点上升至上一层;当当前层中编码符号的数量为奇数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,在父节点满足预设上升条件的情况下并将父节点上升至上一层,并将剩余的一个单一编码符号直接上升至上一层的最前端。
作为一种可选的实施例,上述预设上升条件包括:父节点对应的概率属于上一层对应的概率范围。
在上述步骤中,将父节点上升至上一层后,可以放置在上一层的最前端,然后通过与上一层中最大概率进行比较,确定是否采用父节点对应的概率更新生一层中的最大值。
作为一种可选的实施例,将父节点上升至上一层,包括:将父节点对应的概率与上一层中最大的概率进行比较;如果父节点对应的概率大于上一层中最大的概率,则将父节点置于上一层的最末端,将上一层中最大的概率置于上一层中的最前端;如果父节点对应的概率小于上一层中最大的概率,则将父节点置于上一层的最前端。
可选的,在本申请上述实施例中,在父节点不满足预设上升条件的情况下,将父节点保留在当前层,并与当前层中最大的概率进行比较:
如果父节点对应的概率大于当前层中最大的概率,则将父节点与当前层的最大概率对应的节点更换位置;如果父节点对应的概率小于当前层中最大的概率,则保持父节点当前所处的位置。
作为一种可选的实施例,在将父节点保留在当前层,并与当前层中最大的概率进行比较之后,上述方法还包括:将父节点作为当前层的编码符号,与其他编码符号的概率进行合并。
由上可知,在本发明上述实施例中,均将每一层的概率最大值的编码符号设置于该层的最末端。当该层中编码符号的数量为偶数时,最末端的编码符号会与其他编码符号的概率值相加并上升至上一层,但在该层中编码符号的数量为奇数时,最末端的概率值会直接上升至上一层,从而减小该分支中所有子叶子的编码长度,因此在每一层中,该直接上升的子分支应始终保持为该层的最大值。
上述方案可以用多种编程方式实现,下面对采用fpga实现上述方法进行说明。
在fpga实现中,通过编码符号频数统计直方图来获取每个单元(每个编码符号占一个单元)的频数,在获取待编码数据中每个编码符号出现的概率的之后,添加编码长度空间和编码流空间,其中,编码长度空间用于保存每个编码符号的编码长度,编码流空间用于保存每个编码符号的编码流信息。
将所有概率非零的频数值的编码符号按层归类,归好类的编码符号按照层的由小到大按序排列,每层的最大值放在该层序列的最后。
作为一种可选实施例,在根据每个编码符号出现的概率所对应的概率范围,对编码符号进行分层之后,在分层后的每个编码符号对应的单元中存储单元下辖所有子叶子的标识,其中,标识用于表征每个单元的下辖分支是否包括待编码的编码符号。也即编码树中任一节点的下辖分支是否包括要进行编码的编码符号(编码树中无任何分支的最底端子叶子),以图4为例,该示例中的编码符号包括abcdef,每一个树的节点都有6bit的标识符,每1bit代表了一个对应的符号标志,bit1表示下辖有该编码符号,bit0表示没有该编码符号,在一种可选的实施例中,设置a:bit[5]、b:bit[4]、c:bit[3]、d:bit[2]、e:bit[1]、f:bit[0],则节点55的标志为011111;节点14的标志为000011,节点f的标志为000001。
作为一种可选实施例,在将当前层的编码符号作为子节点,两两合并构成父节点之后,方法还包括:对于位于父节点左侧的子节点,对子节点下辖的编码符号的最底端的编码长度加一,并在已有的编码码流前添加零编码;对位于父节点右侧的子节点中最底端的节点的编码长度加一,并在已有的编码码流前添加一编码。
具体的,在构建编码树时,从最大层(k值最大,即概率范围最小的层)开始,当每一层的个数为偶数时,两两合并上升到上一层,概率值相加;当每一层的个数为奇数时,两两合并上升到上一层时,余下的最后一个单数需直接上升到上一层的最前端。上升一层的新数的频数值将和上层最后端的最大的频数值进行比较,大于最大值则新的概率值和最大值替换位置。在两两合并时,左侧的值中子叶子标志位为“1”的最底端子叶子编码长度加1,在已有的编码码流前添“0”编码,右侧的最底端子叶子编码长度加1,在已有的编码码流前添“1”编码。合并的频数值合并成上一层的1个新的频数值,子叶子标志位或相加(左右分支下辖的所有最底端子叶子均标记为“1”)。
作为一种可选的实施例,当所有编码符号晋升到第一层(即顶层)时,第一层必定会存在两个树,频数较小值为总编码树的左枝干,频数较大值为总编码树的右枝干,按照两两合并时对下辖最底端子叶子的更新后,编码树及所有初始时子叶子的编码长度及编码码流已更新完毕。
图3是根据本发明实施例的一种可选的编码方法的流程图,在一种可选的实施例中,以图3所示的示例,对本申请中的编码方法进行说明。
s31,编码符号频次统计。
s32,编码符号频次归一化。
s33,编码符号概率分层。
在上述步骤中,可以根据公式
s34,同层中概率最大值放在最末端。
s35,判断最底层单元个数是否大于等于2,在最底层单元个数大于等于2的情况下,进入步骤s36,否则进入步骤s37。具体的,上述最底层用于表征分层后最小的概率范围对应的层。
s36,将前两个概率合并,并上升一层,与上一层概率最大值比较。
在最底层单元个数大于等于2的情况下,确定可以将最底层的编码符号进行合并。在该步骤中,将最底层中最前端的两个概率相加,因为其一定满足进入上一层的条件,因此将其上升至上一层,并置于上一层的最前端。
再将合并后的概率与上一层中最大的概率进行比较,如果合并后的概率大于上一层中最大的概率,则更换合并后的概率与上一层中最大的概率的位置,即将上一层中最大的概率至于上一层中的最前端,将合并后的概率至于上一层的最末端;如果合并后的概率小于上一层中最大的概率,则保持当前的位置。
s37,判断最底层单元的个数是否为1。如果最底层单元的个数为1,则进入步骤s38,否则进入步骤s39。
在上述步骤中,如果最底层单元的个数为1,则确定最底层的单元数量为奇数,还存在一个单一的无法与其他单元合并的概率,还需对该单一的单元进行处理;如果最底层单元的个数不为1,则确定最底层的单元数量为偶数,可以通过两两合并的方式完成对该最底层的处理。
s38,该单元直接上升至上一层,并放置在上一层的最前端。
对单一的无法与其他单元合并的概率直接上升至上一层,由于其一定小于上一层的最大值,因此将其放置在上一层的最前端。
s39,将上一层作为当前层进行处理。在对最底层处理完成之后,上一层进行处理,此时,最底层的上一层为当前层。
s310,判断当前层中单元个数是否大于等于2。在当前层中单元个数大于等于2的情况下,进入步骤s311,否则进入步骤s317。
s311,判断当前处理的单元是否为当前层的前两个单元。在当前处理的单元为当前层的前两个单元的情况下,进入步骤s312,否则进入步骤s316。
s312,对前两个单元进行合并。
s313,判断合并后的单元是否满足晋升条件。在合并后的单元满足晋升条件的情况下,进入步骤s314,否则进入步骤s315。
在上述步骤中,如果合并后的单元的概率属于上一层对应的概率区间,则确定合并后的单元满足晋升条件。
s314,上升至上一层,并与上一层的最大概率比较。
在合并后的单元满足晋升条件的情况下,如果合并后的概率大于上一层中最大的概率,则更换合并后的概率与上一层中最大的概率的位置,即将上一层中最大的概率至于上一层中的最前端,将合并后的概率至于上一层的最末端;如果合并后的概率小于上一层中最大的概率,则保持当前的位置。
s315,留在当前层,并与当前层的最大概率比较。
在合并后的单元不满足晋升条件的情况下,留在当前层,并与当前层的最大概率比较,如果合并后的概率大于当前层中最大的概率,则更换合并后的概率与当前层中最大的概率的位置,即将上一层中最大的概率至于当前层中的最前端,将合并后的概率至于当前层的最末端;如果合并后的概率小于当前层中最大的概率,则保持当前的位置。
s316,对前两个单元进行合并,并上升至上一层。
在当前处理的单元不为当前层的前两个单元的情况下,合并后的单元一定满足上升至上一层的晋升条件,因此无需对其是否满足晋升条件进行判断,直接将合并后的单元上升至上一层。
s317,判断当前层单元的个数是否为1。在当前层单元的个数为1的情况下,进入步骤s318,否则进入步骤s319。
s318,该单元直接上升至上一层并放置在上一层的最前端。
在当前层单元的个数为1的情况下,确定当前层中单元的数量为奇数,需要对剩余的一个单元直接处理,即直接将剩余的一个单元上升至上一层,由于剩余的一个单元一定小于上一层中的最大概率,因此将其放置在上一层的最前端。
s319,对上一层进行处理。在上述步骤中,对上一层进行处理的步骤与s310至s318相同。
s320,判断上一层是否为最顶层。在上一层为最顶层的情况下,进入步骤s321,否则进入步骤310。如果上一层不为最顶层,则进入步骤s310,开始对上一层进行处理。
s321,对顶层的两个单元合并,得到最终的二叉树。
图4是根据本发明实施例的一种应用实施例1中的编码方法进行编码的示意图,结合图4所示,六个编码符号分别为:“f:5、e:9、c:12、b:13、d:16、a:45”,其对应的概率分别为:“f:5%、e:9%、c:12%、b:13%、d:16%、a:45%”,根据公式
第五层作为最底层,只包含一个单元,则直接将其上升至第四层,并置于第四层的最前端。此时,第四层包括f:5、e:9和c:12。
第四层包括三个单元,将前两个单元合并得到14,满足上升至第三层的条件,因此将其上升至第三层,由于14对应的概率14%小于第三层中最大的概率16%,因此将其置于第三层的最前端。再将第四层剩余的单一的c:12上升至第三层。此时,第三层包括c:12、14、b:13和d:16。
将b:13和d:16合并得到29,上升至第二层的最前端,再将第三层中的c与14合并得到26,并上升至第二层的最前端。此时,第二层包括:26、29和a:45。
将第二层中的26与29合并后的55,和a:45上升至第一层,再将55和a:45进行合并,得到最终的二叉树。
图5a至图5f为根据本发明实施例的一种构建最优二叉树时fpga中层数据的更新示意图。由图5a所示,第16层为待编码数据的最底层,每个单元下方的数字用于表示该单元的位置。
首先,确定已经读取第16层的最大值x16_7(图5a中位置7)和第15层的最大值x15_3(图5a中位置10)。将第16层中的最前端的两个单元x16_1和x16_2进行合并得到x16_12,其次,判断x16_12是否可以上升至第15层,如果x16_12可以上升至第15层,则将第x16_12与第15层中的x15_3,如果x16_12小于x15_3,则如图5b所示,则将x16_12写入已经属于第15层的位置7。
然后将第16层的x16_5和x16_6相加后得到x16_56,将x16_56上升至第15层,并与第15层的最大值x15_3比较,如果x16_56大于x15_3,则将x15_3放置在位置6,并更新第15层的最大值;如果x16_56小于x15_3,则将x16_56放置在位置6。接着x16_3和x16_4相加得到x16_34后对第15层进行更新,并通过比较x16_34与当前第15层的最大值,确定何值放置在位置5。具体如图5c所示,位置6的x16_56/max用于表示将x16_56上升至第15层的位置6并与第15层的最大值x15_3比较,位置5的x16_34/max用于表示将x16_34上升至第15层的位置5并与第15层的当前最大值比较。
最后,第16层如果除最大值之外还有一个数,剩余的一个数和当前最大值合并后与第15层最大值比较,根据比较结果对位置4进行更新;如果第16层只有最大值,则把第16层的最大值放在位置4,当前层的合并结束。
如果x16_12大于x15_3,则如图5d所示,则将x16_12写入第15层的最末端(位置10),并将x15_3写入位置7。
如果x16_12不能上升至上一层,则与第16层中的最大值x16_7(位置10)进行比较,如果x16_12>x16_7,则更新第16层的最大值为x16_12,并将x16_7写入位置2,如图5e;如果x16_12<x16_7,则将x16_12写入位置7,如图5f所示。
实施例2
根据本发明实施例,提供了一种编码装置的实施例,图6是根据本发明实施例的一种编码装置的示意图,如图6所示,该装置包括:
获取模块60,用于获取待编码数据中每个编码符号出现的概率。
分层模块62,用于根据每个编码符号出现的概率所对应的概率范围,对每个编码符号进行分层。
构建编码树模块64,用于按照概率范围中门限值由小至大的顺序,将概率范围对应的层中的编码符号按照预设规则上升至上一层,直至最小概率范围对应的层中的编码符号上升至顶层,得到待编码数据的编码树。
编码模块66,用于根据编码树编码待编码数据。
可选的,根据本申请上述实施例,获取模块包括:
获取子模块,用于获取每个编码符号出现的频次和待编码数据中所有编码符号的数量。
第一确定子模块,用于根据每个编码符号出现的频次和待编码数据中所有编码符号的数量确定每个编码符号的出现的概率。
可选的,根据本申请上述实施例,分层模块包括:
第二确定子模块,用于确定概率范围以及概率范围对应的层,其中,概率范围包括:
查找子模块,用于查找每个编码符号所属的概率范围,并将每个编码符号归类至所属的概率范围对应的层。
排列子模块,用于将每层中概率最大的编码符号排列在所在层的最末端。
可选的,根据本申请上述实施例,构建编码树模块包括:
第一构成子模块,用于当当前层中编码符号的数量为偶数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,并在父节点满足预设上升条件的情况下,将父节点上升至上一层。
第二构成子模块,用于当当前层中编码符号的数量为奇数的情况下,将当前层的编码符号作为子节点,两两合并构成父节点,在父节点满足预设上升条件的情况下并将父节点上升至上一层,并将剩余的一个单一编码符号直接上升至上一层的最前端。
可选的,根据本申请上述实施例,预设上升条件包括:父节点对应的概率属于上一层对应的概率范围。
可选的,根据本申请上述实施例,第一构成子模块或第二构成子模块包括:
第一比较单元,用于将父节点对应的概率与上一层中最大的概率进行比较。
第一位置调整单元,用于如果父节点对应的概率大于上一层中最大的概率,则将父节点置于上一层的最末端,将上一层中最大的概率置于上一层中的最前端。
第二位置调整单元,用于如果父节点对应的概率小于上一层中最大的概率,则将父节点置于上一层的最前端。
可选的,根据本申请上述实施例,第一构成子模块还包括:第二比较单元,用于在父节点不满足预设上升条件的情况下,将父节点保留在当前层,并与当前层中最大的概率进行比较:如果父节点对应的概率大于当前层中最大的概率,则将父节点与当前层的最大概率对应的节点更换位置;如果父节点对应的概率小于当前层中最大的概率,则保持父节点当前所处的位置。
可选的,根据本申请上述实施例,上述方法还包括:在将父节点保留在当前层,并与当前层中最大的概率进行比较之后,将父节点作为当前层的编码符号,与其他编码符号的概率进行合并。
实施例3
根据本发明实施例,提供了一种存储介质,存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行实施例1中任意一项编码方法。
实施例4
根据本发明实施例,提供了一种处理器,其特征在于,处理器用于运行程序,其中,程序运行时执行实施例1中任意一项编码方法。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。