(学生小白的学习笔记,若有侵权,联系后立即删除。贴上: 参考网址,笔记都是以自身学习状况和脑回路方便自己理解为原则写,如有欠缺或语言逻辑请见谅,若有问题也感谢指出,所有代码部分组合就是完整程序。)
手动霍夫曼编码大致思路:
(1)按从小到大的顺序排列
(2)合并最小两项,分别标记为0和1
(3)合并项与剩下的项重复以上步骤
(4)剩下只有两项时,按标记的倒序给对应项编码
matlab编码的大致思路:
以P=[0.1 0.2 0.3 0.4],顺序标记为1234,N=4举例
码树构建
(1)输入概率向量,检测合法性(每项不小于零,合等于1)
%取得信源概率矩阵,并进行合法性判断
P=input('请输入信源概率向量P=' );
N=length(P);
for component=1:1:N
if (P (component) <0)
error('信源概率不能小于0');
end
end
if((sum(P)-1)>0.0001)
error('信源概率之和必须为1');
end
(2)建:每次检索向量L(1,N);每次的排序向量Q(1,N);总的检索向量index(N-1,N);总的顺序向量G(N-1,N);
(3)合并Q的前两项,排序成下一个Q,每次的位置标记存入L,循环N-1次。一次Q为G的一个行向量,缺的地方补1,一次L为index的一个行向量,缺的地方补0;
%建立各概率符号的位置索引矩阵Index,利于编码后从树根进行回溯,从而得出对应的编码
Q=P;
Index=zeros(N-1,N); %初始化Index
for i=1:N-1
[Q, L]=sort(Q)