采用matlab矩阵和元胞数据结构等可以简单的实现多元霍夫曼编码。
(1) 假设实现Q元霍夫曼编码,首先判断符号数量个数len是否满足(len-Q) / (Q-1)为整数,如果不是,向概率中添加若干0概率事件,事件符号为len+1,len+2...直到满足前面所述等式,添加完后的事件个数记为N。
(2)将事件符号(1-N),父亲节点(先置为0),概率大小(probability)添加到矩阵temp中。
(3)将temp按照概率从大到小排序,截去最后三行,将这三行的父亲节点置为N+1,然后存入矩阵final中。计算这三行的概率之和,形成一个新节点new,new的事件符号为N+1,父亲节点为0,概率大小为选取的三行的概率之和。将new加入temp,重复第三步,直至temp为空。
(4)在搜索节点,构造编码。首先声明alldict元胞矩阵,共三列,第一列第二列分别存储final第一列第二列,第三列为空。
(5)将0-(Q-1)分配给事件符号最大的节点,存入第三列,然后寻找事件符号次大的节点,将0-(Q-1)分配给第三列,如果第三列已经存在部分编码,则将现在分配的编码和已分配的编码合并,并且现在分配的编码放在原来编码的前面。重复第五步,直至没有父亲节点。编号的码已存在alldict的第三列。
(6)将alldict按照第一列排序,选取前len行