公开/公告号CN102255617A
专利类型发明专利
公开/公告日2011-11-23
原文格式PDF
申请/专利权人 鸿富锦精密工业(深圳)有限公司;鸿海精密工业股份有限公司;
申请/专利号CN201010176725.8
申请日2010-05-19
分类号H03M7/40(20060101);H03M7/42(20060101);
代理机构
代理人
地址 518109 广东省深圳市宝安区龙华镇油松第十工业区东环二路2号
入库时间 2023-12-18 03:47:24
法律状态公告日
法律状态信息
法律状态
2020-05-08
未缴年费专利权终止 IPC(主分类):H03M7/40 授权公告日:20140219 终止日期:20190519 申请日:20100519
专利权的终止
2014-12-31
专利权的转移 IPC(主分类):H03M7/40 变更前: 变更后: 登记生效日:20141211 申请日:20100519
专利申请权、专利权的转移
2014-02-19
授权
授权
2012-01-04
实质审查的生效 IPC(主分类):H03M7/40 申请日:20100519
实质审查的生效
2011-11-23
公开
公开
技术领域
本发明涉及一种数据编解码方法,尤其涉及一种哈夫曼树的存储方法及利用数组进行数据解码的方法。
背景技术
传统的哈夫曼编码(Huffman Coding)采用哈夫曼表格来存储哈夫曼树的节点信息,其中,每个节点通常具备以下三种信息:回传值(Value)、编码(Code)和编码长度(Code Length)。当解码时,便可根据编码值,从哈夫曼表格中查找到对应到的回传值。由于每个节点包含三种信息,所以哈夫曼表格中的每一笔资料都需要三个字段来储存,不利于节省存储空间。
发明内容
鉴于以上内容,有必要提供一种哈夫曼树的存储方法,其可利用数组来存储哈夫曼树的节点信息。
鉴于以上内容,还有必要提供一种利用数组进行数据解码的方法,其可利用数组来查找哈夫曼树节点的回传值,对数据进行解码。
一种哈夫曼树的存储方法,该方法包括如下步骤:
根据广度优先搜索算法,依序建立哈夫曼树中每个节点的索引值,其中,每个节点都包含有一个回传值;
从根节点开始,根据该索引值的顺序,依次读取该哈夫曼树中的每个节点;及
将每个节点的信息分成第一部分信息和第二部分信息,存储在一个数组中。
一种利用数组进行数据解码的方法,该数组存储有哈夫曼树中每个节点的信息,每个节点的信息分为第一部分信息和第二部分信息,该方法包括如下步骤:
(a)获取待解码的比特流;
(b)从哈夫曼树中读取第一个节点;
(c)判断该节点是否为叶子节点;
(d)如果该节点不是叶子节点,则依次从该比特流中读取一比特,根据该比特的数值确定下一个搜寻的节点,然后返回步骤(c),继续判断该下一个搜寻的节点是否为叶子节点;
(e)如果该节点是叶子节点,则根据该节点的索引值,从该数组中查找该节点的存储值,从该节点的存储值中获取该节点的第一部分信息的值,作为该节点的回传值;
(f)判断该比特流是否读取完毕;
(g)如果该比特流没有读取完毕,则返回步骤(b);
(h)如果该比特流读取完毕,输出步骤(e)中获取的每个节点的回传值,以完成该比特流的解码过程。
相较于现有技术,所述的哈夫曼树的存储方法及利用数组进行数据解码的方法,其可利用数组来存储哈夫曼树的节点信息,当解码时,再利用该数组来查找哈夫曼树节点的回传值,节省了存储空间,提高了哈夫曼编码的效率。
附图说明
图1是本发明存储模块和解码模块的应用环境图。
图2是本发明哈夫曼树存储方法的较佳实施例的流程图。
图3是现有技术中的一个哈夫曼表格的示意图。
图4是根据图3中的哈夫曼表格得出的哈夫曼树。
图5是根据图4中的哈夫曼树进行索引值编号的示意图。
图6是本发明存储每个节点信息的数据结构示意图。
图7是本发明利用数组进行数据解码的方法的较佳实施例的流程图。
主要元件符号说明
具体实施方式
如图1所示,是本发明存储模块和解码模块的应用环境图。该存储模块22和解码模块23运行于主机2中。所述主机2与显示设备1和输入设备4相连。该主机2还包括存储体20和中央处理器(Central Processing Unit,CPU)24。在本实施例中,所述存储模块22用于利用数组来存储哈夫曼树的节点信息,所述解码模块23用于根据该数组,对数据(如比特流)进行解码,具体流程参见以下描述。在本实施例中,该数组为一维数组。
所述存储体20可以是主机2中的硬盘或数据库等,用于存储资料21。在本实施例中,所述资料21包括待解码的数据(如比特流,Bit stream)等。所述中央处理器24用于控制存储模块22和解码模块23的执行。
所述主机2连接有显示设备1,用于显示解码模块23解码产生的数据等。所述输入设备4可以是键盘和鼠标等,用于进行数据输入。
如图2所示,是本发明哈夫曼树存储方法的较佳实施例的流程图。
步骤S10,存储模块22根据广度优先搜索算法(Breadth FirstSearch,BFS),依序建立哈夫曼树中每个节点的索引值。举例而言,假设有一个如图3所示的哈夫曼表格,由该哈夫曼表格可以得出如图4所示的哈夫曼树。根据广度优先搜索算法,从上而下,从左至右,对图4的哈夫曼树的每个节点进行编号(从0开始),以建立每个节点的索引值,得到图5所示的带索引值的哈夫曼树。其中,每个节点的索引值标示在该节点的上面,用粗体和下划线标示。
步骤S12,存储模块22从根节点(即第一个节点)开始,根据该索引值的顺序,依次读取该哈夫曼树中的每个节点。在本实施例中,存储模块22根据该索引值由小到大的顺序,依次读取该哈夫曼树中的每个节点。
步骤S14,存储模块22将每个节点的信息分成第一部分信息Value2和第二部分信息LeafBit(参阅图6中的A部分所示),并将每个节点的第一部分信息Value2的二进制数值和第二部分信息LeafBit的二进制数值合并在一起,将该合并后的二进制数值对应的十进制数值存储在一个数组中。以下描述中,该合并后的二进制数值对应的十进制数值被称为存储值,该数组被称为哈夫曼数组。具体而言,如果目前节点为内部节点,则Value2值为目前节点的左子节点的索引值与目前节点的索引值之差,LeafBit值为1。如果目前节点为外部节点(即叶子节点),则Value2值为目前节点的回传值(Value),LeafBit值为0。
举例而言,以图5的哈夫曼树为例进行说明。该哈夫曼树节点的回传值介于-3至3之间,对于所有的内部节点来说,每个节点的左子节点的索引值与该节点的索引值之差的最大值为3。由此可知,欲存储该哈夫曼树的一个节点所需的最少位数为3bits(Value2)+1bit(LeafBit)=4bits。如果以软件实现该哈夫曼树的存储数组时,因数组可表示的类型最小为1byte,则可以用C语言建立如下哈夫曼数组:
char Huffman_Array[13]={3,5,7,-2,2,5,0,4,3,5,-4,-6,6}。
以索引值为5的节点来说明,因其为一个内部节点,故该节点的第一部分信息Value2=左子节点的索引值与该节点的索引值之差=2,该节点的第二部分信息LeafBit值为1。假设每个节点用8bits来存储(参阅图6的B部分所示),其中,Value2值用7bits存储,即(0000010)2,LeafBit值用1bit存储。则该节点在数组Huffman_Array中的存储值Huffman_Array[5]=5,即(00000101)2。
如果一个节点为外部节点,如索引值为10的节点,则该节点的第一部分信息Value2=Value=-2,即(1111110)2,第二部分信息LeafBit为0,参阅图6的C部分所示。则该节点在数组Huffman_Array中的存储值Huffman_Array[10]=-4,即(11111100)2。
如图7所示,是本发明利用哈夫曼数组进行数据解码的方法的较佳实施例的流程图。
步骤S20,解码模块23从存储体20中获取待解码的比特流。
步骤S21,解码模块23从哈夫曼树中读取第一个节点,进行解码操作。
步骤S22,解码模块23判断该节点是否为叶子节点。如果该节点不是叶子节点,则执行步骤S23;如果该节点是叶子节点,则执行步骤S24。具体而言,如果该节点的第二部分信息LeafBit值为1,即该节点在哈夫曼数组中的存储值对应的二进制数值的最后一位为1,则解码模块23判定该节点为内部节点。如果该节点的第二部分信息LeafBit值为0,即该节点在哈夫曼数组中的存储值对应的二进制数值的最后一位为0,则解码模块23判定该节点为叶子节点。
步骤S23,解码模块23依次从该比特流中读取一比特,根据该比特的数值确定下一个搜寻的节点,然后返回步骤S22,继续判断该下一个搜寻的节点是否为叶子节点。具体而言,如果该比特的数值为0,则下一个搜寻的节点的索引值为:(目前节点的索引值+目前节点的Value2值)。如果该比特的数值为1,则下一个搜寻的节点的索引值为:(目前节点索引值+目前节点Value2值+1)。
其中,目前节点的Value2值可由以下方法获取:根据目前节点的索引值,从哈夫曼数组中查找目前节点的存储值,从目前节点的存储值中获取目前节点的第一部分信息Value2。具体而言,解码模块23将目前节点的存储值对应的二进制数值右移一位,得到一个右移后的二进制数值,将该右移后的二进制数值转换成十进制数值即得到目前节点的第一部分信息Value2。
步骤S24,解码模块23根据该节点的索引值,从哈夫曼数组中查找该节点的存储值,从该节点的存储值中获取该节点的第一部分信息Value2,作为该节点的回传值(Value)。
步骤S25,解码模块23判断该比特流是否读取完毕。如果该比特流读取完毕,则执行步骤S26;如果该比特流没有读取完毕,则返回步骤S21。
步骤S26,解码模块23输出步骤S24中获取的每个节点的回传值,以完成该比特流的解码过程。在本实施例中,解码模块23将获取的每个节点的回传值输出至显示设备1上。
以下以一个实例说明解码的具体过程。
假设待解码的比特流为:0101000110110111,使用如图5的哈夫曼树,对该比特流进行解码。根据图6的描述,存储该哈夫曼树的数组可以定义为:char Huffman_Array[13]={3,5,7,-2,2,5,0,4,3,5,-4,-6,6}。则解码过程如下所述:
1.首先由根节点(Root node)开始,索引值Index=0。
2.判断此节点是否为叶子节点,查Huffman_Array[0]的最小位为1,所以此节点不是叶子节点。
3.依次从比特流0101000110110111中读取一个比特,即第一次读取第一个比特,第二次读取第二个比特,...,第n次读取第n个比特。因为第一个比特为0,所以Index=(0+(Huffman_Array[0]>>1))=(0+1)=1,则下一个搜寻的节点的索引值为1。其中,Huffman_Array[Index]>>1代表索引值为“Index”的节点的第一部分信息Value2。
4.判断Index=1的节点是否为叶子节点,查Huffman_Array[1]的最小位为1,所以此节点不是叶子节点。
5.从比特流0101000110110111读取下一个比特,因为下一个比特为1,所以Index=(1+(Huffman_Array[1]>>1)+1)=(1+2+1)=4,则下一个搜寻的节点的索引值为4。
6.判断Index=4的节点是否为叶子节点,查Huffman_Array[4]的最小位为0,所以此节点是叶子节点,则回传值=(Huffman_Array[4]>>1)=1。
7.依照上述1~6的类似步骤,继续对比特流0101000110110111中剩余的数据(0101000110110111,下划线部分)进行解码,直至该比特流读取完毕时结束,可得到解码值为:{1,1,-1,1,-2,0}。
最后应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。
机译: 哈夫曼树的存储方法和阵列中的数据解码方法
机译: 哈夫曼解码设备,哈夫曼编码设备和哈夫曼树数据
机译: 哈夫曼树的节点信息存储方法及相应的解码方法