本发明涉及数据处理领域,尤其是一种基于动态霍夫曼树的多路数据编解码方法及装置。
背景技术:
随着当今信息社会的发展,以视频、音频、文本等形式存在的数据正海量增长,迫切需要一种高效的压缩和解压的方法用于数据的保存和传输。
数据压缩是指用尽可能少的码位来表示原始数据,数据压缩在很多领域应用十分广泛,例如:通过压缩以较低的带宽传输和处理图像、语音、文本等数据。压缩后的数据占用较少的存储容量,通过压缩数据可以降低硬件存储费用,降低信号传输的发射功率等。数据压缩在现在数据量爆发的大数据时代下有着重大的作用和意义。
目前数据压缩技术有许多种,按照压缩后对数据的失真度,可分为无损压缩和有损压缩。在许多应用背景下,由于对数据的完整性有较高要求,因此一种高效的无损压缩方法是非常重要的。无损压缩可以通过建立霍夫曼树来降低压缩数据的失真度。但是,现有的编解码方法是在压缩数据过程中逐步构建霍夫曼树的,构建速度慢且效率低;再者,目前的数据压缩方法是针对内容和长度已知的数据进行压缩,不能处理实时产生的流式数据,更不能处理多路实时数据,实时性低且通用性较差,无法满足当今时代的需求;此外,目前的通过建立霍夫曼树进行数据压缩的方法,其编码过程中的霍夫曼树是恒定不变的,导致部分数据压缩失败,降低了数据压缩率。
技术实现要素:
为解决上述技术问题,本发明的目的在于:提供一种无损、高效而且实时性高的基于霍夫曼树的多路动态数据编码方法。
本发明的第二个目的在于:提供一种无损、高效而且实时性高基于霍夫曼树的多路动态数据解码方法。
本发明的第三个目的在于:提供一种无损、高效而且实时性高基于霍夫曼树的多路动态数据编解码装置。
本发明的第一个技术方案是:
一种基于动态霍夫曼树的多路数据编码方法,包括以下步骤:
根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;
动态获取多组待编码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编码的算法对待编码数据进行动态编码。
进一步,所述根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树这一步骤,包括以下步骤:
获取多组先验知识,确定先验知识中原始数据的种类及各类原始数据的取值个数;
根据先验知识,得到各类原始数据概率分布情况;
根据先验知识对编码端进行初始化处理,生成多棵初始霍夫曼树。
进一步,所述根据先验知识,得到各类原始数据概率分布情况这一步骤,包括以下步骤:
设定缓冲区大小,并根据原始数据的种类设定各类原始数据在缓冲区中的排列顺序;
根据先验知识中各类数据的统计情况,得到各类数据的先验概率分布。
进一步,所述根据先验知识对编码端进行初始化处理,生成多棵初始霍夫曼树这一步骤,具体为:
根据先验知识对编码端进行第一初始化处理,生成多棵初始霍夫曼树或者根据先验知识对编码端进行第二初始化处理,生成多棵初始霍夫曼树;
其中,所述根据先验知识对编码端进行第一初始化处理,生成多棵初始霍夫曼树这一步骤,包括以下步骤:
根据先验知识建立每类原始数据的原始霍夫曼树和每类原始数据的循环队列;
根据先验概率分布生成各类原始数据的原始序列;
根据各类符合先验知识的原始序列生成各类原始数据的伪随机序列;
将各类原始数据的伪随机序列输入其对应的循环队列中。
所述根据先验知识对编码端进行第二初始化处理,生成多棵初始霍夫曼树这一步骤,包括以下步骤:
根据先验知识建立每类原始数据的原始霍夫曼树和每类原始数据的循环队列;
将原始霍夫曼树作为初始霍夫曼树用于后续动态编码;
对于每一类数据,在相应的循环队列第一次满时,将当前霍夫曼树结点权值减去相应原始霍夫曼树结点权值得到最新结点权值,并根据最新结点权值重新生成霍夫曼树用于后续动态编码。
进一步,所述动态获取多组待编码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编码的算法对待编码数据进行动态编码这一步骤,包括以下步骤:
根据设定的各类原始数据在缓冲区中的排列顺序,编码端依次获取各类待编码数据;
根据各类待编码数据对应的初始霍夫曼树,对各类待编码数据进行交错编码;
根据待编码数据,更新各类原始数据对应的初始霍夫曼树。
进一步,所述根据待编码数据,更新各类原始数据对应的初始霍夫曼树这一步骤,包括以下步骤:
获取待编码数据并选择相应的编码队列;
判断选择的编码队列是否已满,若是,则将选择的编码队列的队尾数据移出编码队列,对初始霍夫曼树进行更新减操作并执行下一步骤;反之则执行下一步骤;
将待编码数据加入移出队尾数据后的编码队列,并对初始霍夫曼树进行更新加操作。
进一步,所述对初始霍夫曼树进行更新减操作这一步骤,包括以下步骤:
根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树;
将待处理子树中的每一层结点按照设定规则进行排序;
判断始结点的权值是否小于始结点兄弟结点的孩子结点的权值,若是,则在对始结点与始结点兄弟结点所在的待处理子树进行旋转处理后执行下一步骤;反之,则直接执行下一步骤;
根据待处理子树的叶子结点,更新待处理子树的所有结点;
判断当前始结点是否为初始霍夫曼树的根结点,若是,则已将当前霍夫曼树作为最终霍夫曼树,结束更新减操作;反之,则获取当前始结点的父结点,并且返回根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树这一步骤,直至当前始结点为初始霍夫曼树的根节点。
进一步,所述对初始霍夫曼树进行更新加操作这一步骤,包括以下步骤:
根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树;
将待处理子树中的每一层结点按照特定规则进行排序;
判断始结点的权值是否小于始结点父亲结点的兄弟结点的权值,若是,则在对始结点与父亲结点所在的待处理子树进行旋转处理后执行下一步骤;反之,则直接执行下一步骤;
根据待处理子树的叶子结点,更新该子树的所有结点;
判断当前始结点是否为初始霍夫曼树的根结点,若是,则已将当前霍夫曼树作为最终霍夫曼树,结束更新减操作;反之,则获取当前始结点的父结点,并且返回根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树这一步骤,直至当前始结点为初始霍夫曼树的根节点。
本发明的第二个技术方案是:
一种基于动态霍夫曼树的多路数据解码方法,包括以下步骤:
根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;
动态获取多组待解码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错解码的算法对待解码数据进行动态解码。
本发明的第三个技术方案是:
一种基于动态霍夫曼树的多路数据编解码装置,包括:
存储器,用于存放程序;
处理器,执行所述程序,以用于:根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;动态获取多组待编解码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编解码的算法对待编解码数据进行动态编解码。
本发明的编码方法的有益效果是:本发明的编码方法采用了交错编码的算法对待编码数据进行动态编码,克服了现有数据编码方法只能针对已知数据进行编码而不能处理实时产生的多路流式数据的缺点,提高了编码的实时性和通用性;再者,本发明的编码方法在进行初始化处理时就构建了完整的霍夫曼树,克服了现有编码方法在编码过程中逐步构建霍夫曼树的缺点,提高了编码的效率;此外,动态编码方法中的初始霍夫曼树根据实际数据进行动态调整,克服了现有编码方法中霍夫曼树恒定不变的缺点,提高了数据在编码过程中的编码率。
本发明的解码方法的有益效果是:本发明的解码方法采用了交错解码的算法对待解码数据进行动态解码,克服了现有数据解码方法只能针对已知数据进行解码而不能处理实时产生的多路流式数据的缺点,提高了解码的实时性和通用性;再者,本发明的解码方法在进行初始化处理时就构建了完整的霍夫曼树,克服了现有解码方法在解码过程中逐步构建霍夫曼树的缺点,提高了解码的效率;此外,动态解码方法中的初始霍夫曼树根据实际数据进行动态调整,克服了现有解码方法中霍夫曼树恒定不变的缺点,提高了数据在解码过程中的解码率。
本发明的编解码装置的有益效果是:本发明的装置采用了交错编解码的算法对待编解码数据进行动态编解码,克服了现有数据编解码方法只能针对已知数据进行编解码而不能处理实时产生的多路流式数据的缺点,提高了编解码的实时性和通用性;再者,本发明的装置在进行初始化处理时就构建了完整的霍夫曼树,克服了现有编解码装置在编解码过程中逐步构建霍夫曼树的缺点,提高了编解码的效率;此外,动态编解码方法中的初始霍夫曼树根据实际数据进行动态调整,克服了现有编解码方法中霍夫曼树恒定不变的缺点,提高了数据在编解码过程中的编解码率。
附图说明
图1为本发明一种基于动态霍夫曼树的多路数据编码方法的步骤流程图;
图2为本发明一种基于动态霍夫曼树的多路数据解码方法的步骤流程图;
图3为本发明的霍夫曼树的旋转变换示意图;
图4为本发明实施例一的数据编码具体过程示意图;
图5为本发明实施例一的数据编解码具体过程示意图;
图6为本发明实施例一的数据编码整体步骤流程图。
具体实施方式
一种基于动态霍夫曼树的多路数据编码方法,包括以下步骤:
根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;
动态获取多组待编码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编码的算法对待编码数据进行动态编码。
进一步作为优选的实施方式,所述根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树这一步骤,包括以下步骤:
获取多组先验知识,确定先验知识中原始数据的种类及各类原始数据的取值个数;
根据先验知识,得到各类原始数据概率分布情况;
根据先验知识对编码端进行初始化处理,生成多棵初始霍夫曼树。
其中,原始数据是指先验知识中已有的数据,用于编解码的初始化过程,而待编码数据是实际需要用于编解码的即时多路流式数据。
进一步作为优选的实施方式,所述根据先验知识,得到各类原始数据概率分布情况这一步骤,包括以下步骤:
设定缓冲区大小,并根据原始数据的种类设定各类原始数据在缓冲区中的排列顺序;
根据先验知识中各类数据的统计情况,得到各类数据的先验概率分布。
其中,缓冲区的大小根据编解码端的数据处理速度以及原始数据的传输速率来动态设置。
进一步作为优选的实施方式,所述根据先验知识对编码端进行初始化处理,生成多棵初始霍夫曼树这一步骤,具体为:
根据先验知识对编码端进行第一初始化处理,生成多棵初始霍夫曼树或者根据先验知识对编码端进行第二初始化处理,生成多棵初始霍夫曼树;
其中,所述根据先验知识对编码端进行第一初始化处理,生成多棵初始霍夫曼树这一步骤,包括以下步骤:
根据先验知识建立每类原始数据的原始霍夫曼树和每类原始数据的循环队列;
根据先验概率分布生成各类原始数据的原始序列;
根据各类符合先验知识的原始序列生成各类原始数据的伪随机序列;
将各类原始数据的伪随机序列输入其对应的循环队列中。
所述根据先验知识对编码端进行第二初始化处理,生成多棵初始霍夫曼树这一步骤,包括以下步骤:
根据先验知识建立每类原始数据的原始霍夫曼树和每类原始数据的循环队列;
将原始霍夫曼树作为初始霍夫曼树用于后续动态编码;
对于每一类数据,在相应的循环队列第一次满时,将当前霍夫曼树结点权值减去相应原始霍夫曼树结点权值得到最新结点权值,并根据最新结点权值重新生成霍夫曼树用于后续动态编码。
其中,每一种类别的原始数据对应一个循环队列,且每一种类别的原始数据对应一棵霍夫曼树,循环队列的长度主要是根据该类数据的变化快慢来决定。
另外,为了保证初始霍夫曼树拥有较好树形,对初始霍夫曼树的每个叶子结点赋上相同的度数,其中叶子结点的较优赋值为1或者小数。
第一初始化处理是指通过先验知识直接生成原始霍夫曼树,再生成伪随机序列输入到循环队列中以生成初始霍夫曼树。这种初始化处理方案在后续的编码过程中,每编码一个数据,初始霍夫曼树就同时做出相应改变,在第一次循环队列满时,说明伪随机序列已经全部被实际数据替换了。
第二初始化处理是指通过先验知识直接生成原始霍夫曼树后,无需输入数据到循环队列中,初始化即完成了。这种初始化处理方案在后续的编码过程中,循环队列每次进入一个未编码数据,初始霍夫曼树就做一次更新加操作,当循环队列第一次满时,初始霍夫曼树各叶子结点权值需要减去根据先验知识生成的原始霍夫曼树的结点权值(这样就可以保证在循环队列第一次满以后初始霍夫曼树能展现实际数据的分布规律)。
上述两种初始化处理过程中:
第一初始化处理因为从一开始就有旧数据(符合先验知识的伪随机序列)离开循环队列,所以能保证具有较高的压缩率,但是运行量会相应增加;
第二初始化处理的循环队列在一开始是空的,所以在循环队列第一次满前都只需要加入新数据然后对初始霍夫曼树进行更新加操作。在第一次循环队列满时,为了移除先验知识的影响,需要将初始霍夫曼树的权值减去建立原始霍夫曼树时产生的初值(即先验知识)。所以在第一次循环队列满时,每个叶子结点的值都会变化,这时需要用剩余的叶子结点权值重新构建一棵新的霍夫曼树。此时,因为叶子不是加一或减一无法用加减更新,只能重新构树。
综上所述,第一初始化处理产生的初始霍夫曼树是渐变的过程,第二初始化处理产生的初始霍夫曼树在循环队列第一次满时会有突变。两种方法仅仅是初始化方式的不同,在第一次循环队列满后,不管使用哪种方法,其后续编解码以及更新初始霍夫曼树的操作都一样,两者之间的差别就在第一次循环队列满前的编码率以及运行量。
进一步作为优选的实施方式,所述动态获取多组待编码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编码的算法对待编码数据进行动态编码这一步骤,包括以下步骤:
根据设定的各类原始数据在缓冲区中的排列顺序,编码端依次获取各类待编码数据;
根据各类待编码数据对应的初始霍夫曼树,对各类待编码数据进行交错编码;
根据待编码数据,更新各类原始数据对应的初始霍夫曼树。
其中,交错编码算法是指,设定多路数据混编格式和数据编码顺序,然后使用相应的霍夫曼树对数据进行编码。
进一步作为优选的实施方式,所述根据待编码数据,更新各类原始数据对应的初始霍夫曼树这一步骤,包括以下步骤:
获取待编码数据并选择相应的编码队列;
判断选择的编码队列是否已满,若是,则将选择的编码队列的队尾数据移出编码队列,对初始霍夫曼树进行更新减操作并执行下一步骤;反之则执行下一步骤;
将待编码数据加入移出队尾数据后的编码队列,并对初始霍夫曼树进行更新加操作。
其中,所述相应编码队列是指对应待编码数据类型的编码队列。
进一步作为优选的实施方式,所述对初始霍夫曼树进行更新减操作这一步骤,包括以下步骤:
根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树;
将待处理子树中的每一层结点按照设定规则进行排序;
判断始结点的权值是否小于始结点兄弟结点的孩子结点的权值,若是,则在对始结点与始结点兄弟结点所在的待处理子树进行旋转处理后执行下一步骤;反之,则直接执行下一步骤;
根据待处理子树的叶子结点,更新待处理子树的所有结点;
判断当前始结点是否为初始霍夫曼树的根结点,若是,则已将当前霍夫曼树作为最终霍夫曼树,结束更新减操作;反之,则获取当前始结点的父结点,并且返回根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树这一步骤,直至当前始结点为初始霍夫曼树的根节点。
其中,设定的结点排序规则是指霍夫曼树的叶子按照权值的大小自左往右进行升序排序。
进一步作为优选的实施方式,所述对初始霍夫曼树进行更新加操作这一步骤,包括以下步骤:
根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树;
将待处理子树中的每一层结点按照特定规则进行排序;
判断始结点的权值是否小于始结点父亲结点的兄弟结点的权值,若是,则在对始结点与父亲结点所在的待处理子树进行旋转处理后执行下一步骤;反之,则直接执行下一步骤;
根据待处理子树的叶子结点,更新该子树的所有结点;
判断当前始结点是否为初始霍夫曼树的根结点,若是,则已将当前霍夫曼树作为最终霍夫曼树,结束更新减操作;反之,则获取当前始结点的父结点,并且返回根据初始霍夫曼树,获取并将权值已发生改变的始结点、始结点的兄弟结点、始结点兄弟结点的孩子结点以及始结点的父亲结点作为待处理的子树这一步骤,直至当前始结点为初始霍夫曼树的根节点。
一种基于动态霍夫曼树的多路数据解码方法,包括以下步骤:
根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;
动态获取多组待解码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错解码的算法对待解码数据进行动态解码。
其中,解码端的初始化处理过程与编码端类似,且使用的缓冲区窗口跟编码端的一致。另外,由于已编码数据的长度不一定,所以解码端对于获取到的已编码数据是按位读取的。
一种基于动态霍夫曼树的多路数据编解码装置,包括:
存储器,用于存放程序;
处理器,执行所述程序,以用于:根据多组先验知识进行初始化处理,得到多棵初始霍夫曼树;动态获取多组待编解码数据,根据初始化处理结果和多棵初始霍夫曼树,采用交错编解码的算法对待编解码数据进行动态编解码。
下面结合说明书附图和具体实施例对本发明作进一步解释和说明。
实施例一
针对现有数据编解码方法构建霍夫曼树速度慢且效率低,并且无法对实时流式数据进行编解码的问题,本发明提出了一种基于动态霍夫曼树的多路数据编解码方法,通过霍夫曼树对实时动态数据进行编解码,提高了编解码的实时性和通用性,且通过在方法的初始化处理过程就构建完整的霍夫曼树,克服了现有方法在编解码过程中逐步构建霍夫曼树的缺点,提高了编解码的效率。进一步,本发明在编码过程中,每编码一个数据,都会动态调整霍夫曼树,从而保证霍夫曼树的编码能符合当前的数据分布规律,整个编码过程会根据数据分布规律的变化而对霍夫曼树进行调整,从而保证具有较高的编码率;另外,本发明在编码端进行动态调整的过程中,解码端无需额外的控制信息也能同步变化,保证了解码的一致性。
参照图1、图2和图5,本发明的一种基于动态霍夫曼树的多路数据编解码方法的具体实现过程如下:
a、获取先验知识。
1)、规定各类数据的输入顺序规则:若各类数据的边界可隐含,则无需使用特定顺序规则;若各类数据无法直接隐含边界,则需要设计特殊的顺序规则,其原则是添加尽可能少的记录数据,实现边界隐含。
例如:原始数据共有4类数据,分别为a、b、c、d。其数据输入顺序为abcdabcd…其中每个字母表示某一类数据,可包含多个相同类型的数据,并且每次的数据个数可以不等。当第i类数据进入缓冲区窗口时,用函数f(i)=i%4对其类型进行判断;然后根据f(i)的值,选择第f(i)个循环队列和霍夫曼树。函数f(i)可根据实际情况设定,通过f(i)可在编码时准确选择第i类数据的霍夫曼树进行编码,从而保证各类数据的高压缩率。
2)、先验概率分布:根据先验知识中各类数据的统计情况,得到各类数据的先验概率分布。
b、编码端设定缓冲区窗口。
由于多路并发数据是实时产生的,为保证原始数据不会因瞬间流量过大处理不及而丢失,需按实际情况设定缓冲区大小,以方便后续处理。设定缓冲区窗口大小的具体步骤为:对于每类数据按riff格式输入缓冲区窗口。如图4所示,head代表取值范围,用于记录随后的data数据的个数,data记录该数据的实际内容。
如上例所述,当规定输入顺序为abcdabcd…后,由于每次不同类型数据输入的个数不定,而head为确定的取值范围,所以需要保证每类数据每次输入的长度在head的范围内。为此,若某类数据在缓冲区的长度过短,可将该类数据与后续的同类数据合并。
c、根据先验知识对编码端进行初始化处理,生成多棵初始霍夫曼树。
在不同类型参数下,数据的分布应该是各不相同的。因此在条件允许的前提下,应预先统计各类数据取值(即各类数据包含的数据总数)概率,并将其固化于编解码端。故在初始化时,可通过使用对应类型数据的取值的先验统计分布概率,建立相应的原始霍夫曼树,以提高开始时的编码率。
直接使用根据先验概率学习的原始霍夫曼树设定编码端的初始霍夫曼树,在第一次循环队列满时,为保证数据编码是实际数据驱动的,需要根据当前循环队列重新构建霍夫曼树。该过程在第一次循环队列满前,一直使用先验概率和实际数据规律进行编码,但因不能保证该先验概率完全符合当前实际数据,所以会影响压缩率。为了再进一步提高编码率,对于某类数据,当编码端输入的某类数据长度等于循环队列长度时,则在编码端完全使用后验知识作为建树依据,立即重建一次霍夫曼树。所述初始化霍夫曼树过程中,可通过使用初始伪随机序列模拟信号实现,具体过程为:
1)、建立原始霍夫曼树并设定循环队列长度。
根据该类数据的取值个数确定霍夫曼树的叶子个数。为保证霍夫曼树具有较好的树形,根据实际情况,可在编码端给叶子结点赋值构建一个原始的霍夫曼树,例如霍夫曼树每个叶子结点底值为1。
其中,为使霍夫曼树树形更合理,对于某类数据,在循环队列长度远大于包含的数据总数时,将霍夫曼树叶子权值的初值设为1;在循环队列长度等于或小于包含的数据总数时,将霍夫曼树叶子权值的初值设为一个小于1的数。该过程应在编码端和解码端均进行,而且对于同类数据,编码端和解码端的初值设置应一致。
设定编码端各类数据的循环队列长度:由于各类原始数据是流式混编进入编码端的,为方便统计某类数据包含的数据总数在近一段时间的概率分布情况,需要为每类数据设定循环队列长度,具体包括以下步骤:
s1、对于某类数据,其循环队列长度应为该类数据包含的数据总数的n倍,如n∈[10,20],以保证该类数据的霍夫曼树不会出现过多的无统计结点,导致编码率过低。
s2、若已知某类数据的变化规律较快,则n应取较小的数,如n∈[5,10],以保证霍夫曼树能及时响应该类数据的变化规律。
s3、若已知某类数据呈现某一基本不变的规律,则可将该类数据的循环队列长度设定为无限长。也就是说,该类数据无需设定循环队列长度,每次可直接对该类数据的霍夫曼树进行更新加操作。
2)、生成符合先验概率的原始序列。
根据先验概率学习的原始霍夫曼树的权值,记数值取值范围为m种,第i种数值的频数为fi、概率为ki,循环队列长度为w。
故生成的原始序列o为:v1,…,v1,……,vi,…,vi,……,vm,…,vm,其中v1个数为
3)、产生初始伪随机序列。
设伪随机函数为rand(x,l,u,k)=(sin(x)*k)%(u-l)+l,其中x为输入变量,l为下界值,u为上界值。k为任意正整数并且k为比1010(u-l)大的最小质数。
设定交换函数为swap(i,j,a),其中a为某一确定数组,数组大小为size(a),i,j为数组下标,其中i,j∈[1,size(a)]。swap(i,j,a)表示将a中下标为i,j的元素位置互换,结果返回新的数组a。
则可根据原始序列o,得到伪随机序列r:先令r等于o,然后循环执行函数r=swap(i,rand(i,1,w,k),r),其中,i的取值为从1到w-1。循环结束后得到的r即为该霍夫曼树的初始伪随机序列。
其中,作为一种简便方法,可以在某类初始输入数据长度小于循环队列长度前,使用先验统计频数和当前数据统计频数之和作为建立霍夫曼树的依据;而当编/解码端输入某类数据长度等于循环队列长度时,则在编/解码端完全使用后验知识作为建树依据,直接将霍夫曼树的各个叶子减去初始权值,并立即重建一次霍夫曼树,从而实现编解码都由实际数据进行驱动。
4)、初始化所有类别数据的霍夫曼树。
将伪随机序列r输入到编码端,从而生成一个符合先验概率的霍夫曼树。
对所有类别的原始数据,分别循环执行步骤c的具体步骤1)、2)和3),直至将所有类别数据的原始霍夫曼树完成初始化。
d、根据初始化处理结果和多棵初始霍夫曼树,采用交错编码的算法对多组原始数据进行动态编码,具体步骤为:
1)、编码端从缓冲区窗口接收原始数据;
对于从缓冲区窗口进入的数据
a)、当j≤head时,表明该类数据还没全部编码完成,则继续选择相应的霍夫曼树进行编码。
b)、当j>head时,说明该类数据已经完成了编码过程,并且由预先规定的riff格式可知接下来的数据为下一类数据的head,则选择相应的霍夫曼树进行编码。
2)、将编码后的数据输出到文件。
e、更新各类原始数据对应的初始霍夫曼树。
在数据
霍夫曼树根据qf(i)实时更新。在更新霍夫曼树时,由于霍夫曼树的权值是渐变的,为了减少更新霍夫曼树的计算复杂度,可通过以下方法实现,具体方法为:
a)、当qf(i)移除队尾元素时,执行更新减操作,具体包括:
s1:将改变权值的结点、其兄弟结点、其兄弟结点的两个孩子结点和其父亲结点作为待处理子树。
s2:排序:对上述待处理子树中每一层按左小右大的规则进行排序。
s3:旋转,比较改变权值的结点与该结点兄弟结点的孩子结点的权值的大小,如果该结点的权值小,则该待处理子树需要旋转。
s4:根据叶子结点更新该待处理子树的所有结点。
s5:根据上述步骤s1-s4处理该待处理子树父亲节点,一直递归到霍夫曼树的根节点为止。
b)、当
s1:将改变权值的结点、其兄弟结点、其兄弟结点的两个孩子结点和其父亲结点作为待处理子树。
s2:排序:对上述待处理子树中每一层按左小右大的规则进行排序。
s3:旋转,比较改变权值的结点与该结点父亲结点的兄弟结点的权值的大小,如果该结点的权值小,则该待处理子树需要旋转。
s4:根据叶子结点更新该待处理子树的所有结点。
s5:根据上述步骤s1-s4处理该待处理子树父亲节点,一直递归到霍夫曼树的根节点为止。
定义霍夫曼树的左旋转操作为:对于排序后的霍夫曼树,如图3中树a)所示,在该子树中有a、b、c三个叶子结点。当叶子结点a权值减少并且a<c时,或者叶子结点c权值增加并且c>a时,则该树需要左旋转:先将a、b组合为一个结点再和c组合,从而构成新的霍夫曼树,即由图3的树a)转成图3的树b)。
定义霍夫曼树的右旋转操作为:对于排序后的霍夫曼树,如图3中树b)所示,在该子树中有a、b、c三个叶子结点。当叶子结点a权值增加并且a>c时,或者叶子结点c权值减少并且c<a时,则该树需要右旋转:先将b、c组合为一个结点再和a组合,从而构成新的霍夫曼树,即由图3的树b)转成图3的树a)。
f、参照图2,基于上述编码方法a-e(其中解码端的霍夫曼树初始化处理步骤类似于编码端,具体可参照图6),一种基于动态霍夫曼树的多路数据解码方法的具体步骤为:
1)、解码端从缓冲区窗口接收编码数据。
由于数据编码后的位数是不定长的,为此在解码刚开始通过按位读取编码数据,取相应的霍夫曼树进行解码,当遍历到霍夫曼树的叶子结点即可得到待解码数据的大小head',且区分了该类数据的head'和data'。
对于从缓冲区窗口进入并解码的数据
a)、当j≤head′时,表明该类数据还没全部解码完成,则继续选择相应的霍夫曼树进行解码。
b)、当j>head′时,说明该类数据已经完成了解码过程,并且由预先规定的riff格式可知接下来的数据为下一类数据的head′。则选择相应的霍夫曼树进行编码。
2)、获取并将动态待解码数据进行分类,根据分类结果选取对应待解码数据类别的初始霍夫曼树,具体为:
根据预先设定规则(即上述编码过程中相同的规则),选择对应的h′f(i)进行解码,并输出结果到文件;缓冲区窗口按位读取数据,按数据遍历h′f(i)即可得到解压数据
3)、更新对应数据类别的初始霍夫曼树,具体步骤为:
每当有新的解码数据
a)、当qf(i)移除队尾元素时,执行更新减操作,具体包括:
s1:将改变权值的结点、其兄弟结点、其兄弟结点的两个孩子结点和其父亲结点作为待处理子树。
s2:排序:对上述待处理子树中每一层按左小右大的规则进行排序。
s3:旋转,比较改变权值的结点与该结点兄弟结点的孩子结点的权值的大小,如果该结点的权值小,则该待处理子树需要旋转。
s4:根据叶子结点更新该待处理子树的所有结点。
s5:根据上述步骤s1-s4处理该待处理子树父亲节点,一直递归到霍夫曼树的根节点为止。
b)、当
s1:将改变权值的结点、其兄弟结点、其兄弟结点的两个孩子结点和其父亲结点作为待处理子树。
s2:排序:对上述待处理子树中每一层按左小右大的规则进行排序。
s3:旋转,比较改变权值的结点与该结点父亲结点的兄弟结点的权值的大小,如果该结点的权值小,则该待处理子树需要旋转。
s4:根据叶子结点更新该待处理子树的所有结点。
s5:根据上述步骤s1-s4处理该待处理子树父亲节点,一直递归到霍夫曼树的根节点为止。
本发明提出了一种基于动态霍夫曼树的多路数据编解码方法,通过动态调整各类数据的霍夫曼树,实现对接收流式多路数据的编解码。与现有技术相比,本发明的方法具有以下优点:
(1)通过不断接收新的流式数据,动态调整对应数据类型的霍夫曼树,从而保证较高压缩率。
(2)支持多路并发的流式数据,并且各类数据边界隐含无需占用额外数据空间。
(3)在不占用额外控制信息下,编解码端保持一致性,保证解压的正确性。
(4)本发明的方法对原始数据边压缩边统计,无需在方法开始预先统计或存储数据,节省了存储空间。
(5)通过对动态的数据进行编解码,本发明采用特殊的树形调整机制对霍夫曼树进行动态更新,有助于保证后续编解码的正确率以及持续性。
(6)本发明基于霍夫曼树对多路动态数据进行编解码,在方法的开始就构建好初始霍夫曼树,大大提高了霍夫曼树的构建效率。
(7)本发明的编解码端自动同步,使用相同的霍夫曼树调用顺序,编解码速度快且正确率高。
(8)本发明的编码方法在开始阶段通过使用内含先验概率构建初始伪随机序列,从而提高了初始启动时的压缩率并加快了初始霍夫曼树的构建。
以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。