编写matlab函数实现huffman编码的算法
- 格式:pdf
- 大小:401.34 KB
- 文档页数:19
r元huffman编码的matlab实现在数据压缩中,Huffman编码是一种常用的编码方式,它可以通过对不同字符出现频率的统计来生成一个不同长度的编码表,从而实现数据的压缩和解压缩。
而r元Huffman编码则是在Huffman编码的基础上增加了一个参数r,用于指定编码表中每个编码的长度必须是r的倍数。
这种编码方式在某些应用中,如无线传感器网络中的数据传输,有着更好的适用性和效率。
本文将介绍如何使用MATLAB实现r元Huffman编码。
具体步骤如下:1. 首先,需要先对数据进行预处理,将数据划分为长度为r的组,对每个组进行编码。
可以使用MATLAB中的reshape函数来完成这一步骤。
2. 对每个编码组进行频率统计,得到每个符号出现的频率。
3. 根据频率生成Huffman树,并构建编码表。
4. 将每个编码组按照编码表进行编码,生成压缩后的数据。
5. 对压缩后的数据进行解压缩,得到原始数据。
下面是一个简单的r元Huffman编码的MATLAB实现示例:```matlabfunction [compressed_data, codebook] =rHuffman_encode(input_data, r)% 输入参数:% input_data: 待压缩的数据,一个一维向量% r: 编码长度,一个正整数% 输出参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% 预处理数据,将数据划分为长度为r的组num_groups = floor(length(input_data)/r);input_data = input_data(1:num_groups*r);input_data = reshape(input_data, r, num_groups)';% 对每个组进行频率统计freq = hist(input_data(:), unique(input_data(:)));% 生成Huffman树,并构建编码表tree = huffTree(freq);codebook = huffCode(tree);% 对每个编码组进行编码compressed_data = [];for i=1:num_groupsgroup_code = codebook([codebook.symbol] ==input_data(i,1)).code;for j=2:rgroup_code = [group_code, codebook([codebook.symbol] == input_data(i,j)).code];endcompressed_data = [compressed_data, group_code];endendfunction decoded_data = rHuffman_decode(compressed_data, codebook, r)% 输入参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% r: 编码长度,一个正整数% 输出参数:% decoded_data: 解压缩后的数据,一个一维向量% 根据编码表进行解码decoded_data = [];while ~isempty(compressed_data)code = compressed_data(1:r);for i=1:length(codebook)if strcmp(code, codebook(i).code)decoded_data = [decoded_data, codebook(i).symbol];compressed_data = compressed_data(r+1:end);break;endendendend```以上代码实现了r元Huffman编码的两个基本函数:编码函数`rHuffman_encode`和解码函数`rHuffman_decode`。
Huffman编码的matlab实现一、信源编码介绍为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对所施行的变换。
具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。
既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。
当然,这些都是广义的信源编码。
一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。
前者称为解除相关性,后者称为概率均匀化。
信源编码的一般问题可以表述如下:信源编码若某信源的输出为长度等于M的符号序列集合式中符号A为信源符号表,它包含着K个不同的符号,A={ɑk|k=1,…,K},这个信源至多可以输出K M个不同的符号序列。
记‖U‖=KM。
所谓对这个信源的输出信源编码进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输出的符号序列集合U。
若V的各个序列的长度等于 N,即式中新的符号表B共含L个符号,B={b l|l=1,…,L}。
它总共可以编出L N个不同的码字。
类似地,记‖V‖=LN。
为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系‖V‖=L N≥‖U‖=KM或者N/M≥log K/log L下面的几个编码定理,提供了解决这个矛盾的方法。
它们既能改善信息载荷效率,又能保证码字唯一可译。
离散无记忆信源的定长编码定理对于任意给定的ε>0,只要满足条件N/M≥(H(U)+ε)/log L那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。
编写Matlab函数实现哈夫曼编码的算法一、设计目的和意义在当今信息化时代,数字信号充斥着各个角落。
在数字信号的处理和传输中,信源编码是首先遇到的问题,一个信源编码的好坏优劣直接影响到了后面的处理和传输。
如何无失真地编码,如何使编码的效率最高,成为了大家研究的对象。
哈夫曼编码就是其中的一种,哈夫曼编码是一种变长的编码方案。
它由最优二叉树既哈夫曼树得到编码,码元内容为到根结点的路径中与父结点的左右子树的标识。
所以哈夫曼在编码在数字通信中有着重要的意义。
可以根据信源符号的使用概率的高低来确定码元的长度。
既实现了信源的无失真地编码,又使得编码的效率最高。
二、设计原理哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
而哈夫曼编码的第一步工作就是构造哈夫曼树。
哈夫曼二叉树的构造方法原则如下,假设有n个权值,则构造出的哈夫曼树有n个叶子结点。
n 个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加入森林;(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
具体过程如下图1产所示:(例)图1 哈夫曼树构建过程哈夫曼树构造成功后,就可以根据哈夫曼树对信源符号进行哈夫曼编码。
具体过程为先找到要编码符号在哈夫曼树中的位置,然后求该叶子节点到根节点的路径,其中节点的左孩子路径标识为0,右孩子路径标识为1,最后的表示路径的01编码既为该符号的哈夫曼编码。
实验二Huffman编码一实验目的1 通过本实验实现信源编码——Huffman编码2 编写M文件实现,掌握Huffman编码方法二实验要求1 了解matlab中M文件的编辑、调试过程2 编写程序实现Huffman编码算法三实验步骤1 输入Huffman编码程序2 运行程序,按照提示输入相应信息,并记录输入信息,及运行结果。
注:观察结果方法:data(1).Code显示a1的编码,同理显示data(2).Code,a2的编码结果。
3 思考:该程序编出的Huffman码是否是最小码方差的码?为什么?四报告要求五附Huffman编码程序clearN=input('请输入信源符号的个数:') ;for i=1:N%data(1).name=input('请输入各信源符号的名称:');data(i).p=input('请输入各信源符号发生的概率:');endfor i=1:Npp(i)=data(i).p;data(i).imap=i; %各符号在编码过程中的指针data(i).Code=''; %各符号的编码结果endfor j = 1:N % N——信源符号的个数for i = 1:N - jif (pp(i) > pp(i + 1))fT = pp(i);pp(i) = pp(i + 1);pp(i + 1) = fT;for k = 1:Nif data(k).imap == idata(k).imap = i + 1;elseif data(k).imap == i + 1data(k).imap = i;endendendendendp=pp;%%%%%%%%%%%%%%%%%%%%% %// 计算哈夫曼编码表%// 开始编码for i=1:N-1for k = 1:Nif data(k).imap== idata(k).Code = strcat('1',data(k).Code);elseif (data(k).imap== i + 1)data(k).Code = strcat('0',data(k).Code);endendp(i + 1) = p(i + 1)+p(i);for k = 1:Nif (data(k).imap == i)data(k).imap = i + 1;endendfor j = i + 1:N-1if p(j) >p(j + 1)fT =p(j);p(j) = p(j + 1);p(j + 1) = fT;for k = 1:Nif (data(k).imap == j)data(k).imap = j + 1;elseif (data(k).imap == j + 1)data(k).imap = j;endendendendend。
Matlab 中实现哈夫曼编译码:n=input('Please input the total number: ');hf=zeros(2*n-1,5);hq=[];for ki=1:nhf(ki,1)=ki;hf(ki,2)=input('Please input the frequency: ');hq=[hq,hf(ki,2)];endfor ki=n+1:2*n-1hf(ki,1)=ki;mhq1=min(hq);m=size(hq);m=m(:,2);k=1;while k<=m%del min1if hq(:,k)==mhq1hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelsek=k+1;endendk=1;while hf(k,2)~=mhq1|hf(k,5)==1%find min1 location k=k+1;endhf(k,5)=1;k1=k;mhq2=min(hq);k=1;while k<=m%del min2if hq(:,k)==mhq2hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelseendendk=1;while hf(k,2)~=mhq2|hf(k,5)==1%find min2 locationk=k+1;endhf(k,5)=1;k2=k;hf(ki,2)=mhq1+mhq2;hf(ki,3)=k1;hf(ki,4)=k2;hq=[hq hf(ki,2)];endclcchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');while choose==1|choose==2if choose==1a=input('Please input the letter you want to Encoding: ');k=1;while hf(k,2)~=ak=k+1;if k>=ndisplay('Error! You did not input this number.');breakendendif k>=nbreakendr=[];while hf(k,5)==1kc=n+1;while hf(kc,3)~=k&hf(kc,4)~=kkc=kc+1;endif hf(kc,3)==kelser=[1 r];endk=kc;endrelsea=input('Please input the metrix you want to Decoding: ');sa=size(a);sa=sa(:,2);k=2*n-1;while sa~=0if a(:,1)==0k=hf(k,3);elsek=hf(k,4);enda=a(:,2:sa);sa=sa-1;if k==0display('Error! The metrix you entered is a wrong one.');breakendendif k==0breakendr=hf(k,2);endchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');clc;endif choose~=1&choose~=2clc;end。
霍夫曼编码matlab在Matlab中实现霍夫曼编码可以通过以下步骤完成:1. 构建霍夫曼树,首先,你需要根据输入的数据统计每个符号出现的频率。
然后,使用这些频率构建霍夫曼树。
你可以使用Matlab中的数据结构来表示霍夫曼树,比如使用结构体或者类来表示节点。
2. 生成霍夫曼编码,一旦构建了霍夫曼树,你可以通过遍历树的方式生成每个符号对应的霍夫曼编码。
这可以通过递归或者迭代的方式实现。
3. 对数据进行编码和解码,使用生成的霍夫曼编码对输入的数据进行编码,然后再对编码后的数据进行解码。
这可以帮助你验证霍夫曼编码的正确性。
以下是一个简单的示例代码,用于在Matlab中实现霍夫曼编码: matlab.% 假设有一个包含符号频率的向量 freq 和对应符号的向量symbols.% 构建霍夫曼树。
huffTree = hufftree(freq);% 生成霍夫曼编码。
huffCodes = huffenco(symbols, huffTree);% 对数据进行编码。
data = [1 0 1 1 0 1 1 1]; % 你的输入数据。
encodedData = huffenco(data, huffCodes);% 对数据进行解码。
decodedData = huffmandeco(encodedData, huffTree);需要注意的是,以上代码仅为简单示例,实际应用中可能需要根据具体情况进行调整和完善。
同时,对于大规模数据的处理,也需要考虑到内存和性能方面的优化。
希望这个简单的示例能够帮助你在Matlab中实现霍夫曼编码。
霍夫曼编码的MATLAB实现%哈夫曼编码的MATLAB实现(基于0、1编码):clc;clear;A=[0.3,0.2,0.1,0.2,0.2];信源消息的概率序列A=fliplr(sort(A));%按降序排列T=A;[m,n]=size(A);B=zeros(n,n-1);%空的编码表(矩阵)for i=1:nB(i,1)=T(i);%生成编码表的第一列endr=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在%该列的位置r=(B(t-1,j)+B(t,j));%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T));endB;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA%排序后的原概率序列END%编码结果for i=1:n[a,b]=size(char(END(i)));endavlen=sum(L.*A)%平均码长H1=log2(A);H=-A*(H1')%熵P=H/avlen%编码效率提取这一列两个最小值相加在后一列中的位置以及其编码。
clea r allf printf (' Re a ding data、、、')d ata= imreadC camera man、tif');da t a=uin t 8 (da t a) ;%读入数据,井将数据限制为u i n t 8fprintfC Done!\n')%编码压缩fprintf pre s sing da t a、、、):[z i pp e d, info] = n orm 2 huff (data):fprintfC D one!\n )%解压缩fp rin t f (* pressing data、、、');u nzi p ped=h u ff 2 n o r m(zi p ped, in f 0 );f p r intf (' Done!\n* )%测试就能否无失貞.isOK=i s e qua 1 (data(:)»unz i pp ed(:))%显示压缩效果whos da t a z ippe d u n z i ppedfun c ti 0 n [zi pp ed, info] =norm2 h u f f ( v e c t or)if ~isa( Y ect o r,' uint 8 *)»er r or C i npu tar gume n t must be a uint 8 vector*)endvecto r =ve c t o r (:)':%将输入向量转换为行向量f=freq u en c y (vec t or);%讣算个元素出现猖概率sirabo I s=fi n d (f"=0);f=f(simbols);%W元素按出现得概率排列[f, s 0 rti n d ex] = s ot (f ):simbols = simbols( s ortindex):%产生码字ge n e r ate the c odeword as the 5 2 bi t s of a do u bl elen= 1 e ng t h( s imb o Is);s i mb 0 ls_in d ex=num2cell (1: len);c odew 0rd_tmp= c elKle n , 1 ):wh i le le n g t h ( f )〉1,ind exl= s imb o ls_index⑴;index 2 =simb o 1 s _in d ex{ 2 };codeword_tm p (i n dexl)=a d dnod e( c odeword_tmp (ind e xl) .u i n t8(0)); c 0 d e w 0 rd_ t mp( ind ex2) = a ddno d e (co d e word_tm p (index 2 ), u i ntS (1 )):f=[sum (f(1:2)) fC3:end)];simbols_in d e x=[{[ i n d e x 1 i n d e x2]} simb o ls_ i ndex (3:e n d )];%将数据重新排列,就是两个右点得频率尽量与前一个iT点得频率想肖r esort da t a in orde r to h av e two no d es w i th ! ov e r fr e que n cy asfirst to[ft so r ti n dex]=sort(f):sim b ols_index=s i mbols_index(so r tindex):end$对应相应得元素与码字codew ord =cell( 2 56 :1);c odew 0 rd (sim b ols)=codew o rd_tmp :%讣算总得字符串长度len=0:for index=l : length (vector) >le n =1 e n+ 1 ength (codew ord {doubl e (vector (index) )+1)): end%产生01序列st r ing=repraa t (u i n t8(0)» I en);poin t er= I :for inde x =1:1 e ngth(vect or),co d e=cod eword{dou b 1 e(v e ct o r (inde x ))+1};le n =length(co de);strin s (pointer+(0 :len-l)) =code;poin t e r=poin t er+len :en d%如果需要,加零len= 1 ength ( s tring);p ad=8-mod (1 e n, 8);辻 pad> 0 ,s t ring=[ s tring u in t 8(zeros (1 , pad))];end财呆存实际有用得码字cod e wo r d=co d ew o rd (simbo 1 s);c ode I en=z e r o s (s i ze (codeword ));weigh t s=2、* (0:23);max c ode I e n= 0 ;fo r ind ex 1; length ( cod ew ord), len=lengt h (cod e word{i n de x });ifen dend co d eword= [code wor d {:}] 1 e n>m a s c od e 1 e n,max cod e le n =len :n d1 e n>0rc 0 de=sum(w e ig li t s ( codeword {index} ==1)):cod e =bitset(cod e , le n +1);cod eword {i nd ex} =code :co d ele n (ind e x) =len;e if%汁算压缩后得向量co ls= I eng t h( s tri n g) / 8 ;s t r i ng= r eshape (strin g , 8, co 1 s);weights=2、* ( 0 : 7 );zip p e d = U intS (weights*d o u b 1 e (st ring)):%存储一个稀疏矩阵h uf f c 0 des=sp arse (1, 1);% init s p arse ma t r ixfor in d e x=l: nu me 1 ( c odeword),huffcod e s( c o dewo r d (ind e x), 1 ) =s i m b ols (index):end瓯产生信息结构体i nfox pad = pad ;info、rati o =cols、/leng t h(v e c tor):i n fox 1 en g th=l e ngth(vec t or);info, max c od e len=maxc o de 1 en;fun c t i 0 n codewor d _new=a d dno d e (co d eword_old, item)codew ord _ne w=cell ( s iz e (cod e word_ol d )):for index=l;lens t hCcodewor d _old),c 0de w 0 rd_new{in dex}=Eitemcod ewo r d _old{i n de x }];endfu n c t ion v e c t or=huf f 2norm (zipped, info)%HVFF2X0R>I Huffman 解码器%IIVFF2N0RM(X, INFO)根据倚息体结构info返回向星zipped得解码结果%%矩阵参数以X(:)形成输入i f 2 i S a ( Z i P ped,' uintS*).error (' i n pu t a r gumen t mus t be a uintS vector')end%产生01序列1 e n=l e ngth(zi p p ed);str i ng=repma t (uint 8 (0) ,1, len^ * 8 );b it i n dex= 1 :8;for i n d e s+1:I en,s t r in s (b i tindes+g、* (ind e x -1)) =uint8( b itget ( z ipped(index), bitind ex));end%调整字符串st r ing= I 0 gica 1 (st r ing (:)');% remove 0 padd i n g1 e n =lengt h ( s t ring);%解码weig h t s =2、* (0:51):V ecto r =re p mat (uintS ( 0 ) , 1 , in f o, length);vec t orind e x=l;c 0 deinde x =1:c 0 de=O;for i n d ex=l: le n ,code=bit s et(coder cod e i n des, s t r i ng (ind ex));] codein d e x=c o de i n d ex+ 1 ;byte=dec o de ( b i t set ( c o de, codei n dex), i n f o):if by t e>0- % V e ctor ( V ector i n d ex) =byte-l;cod ei n d e x= 1 :code = 0;vecto r i n d e X = V ect o rindex+ 1 ;endendfu n Ct i 0 n b yt e =d e code (code, i nfo)b y te=in f o、huf f cod e s (code);func t ion f=frequ e ncy (v e ct o r )幣FREQUENCY计算元素出现概率I f^isa(v e ctor,' u i nt8'),e rror ('input a r gum ent mu st b e a uin t 8 vector') endf =repm a t (Or 1* 2 5 6);%扫描向量len= length (vec t or);for ind e s= 0 :256, %f (ind ex+1) =sum(ve c tor==uint8(i n de x ));end%归一化f=f、/ 1 e n :。
Huffman编码及译码的MATLAB实现沈逸峰(上海师范大学信息与机电工程学院,上海200333)摘要:本论文首先介绍了Huffman编码的原理以及与其它编码相比它的优势随在,随后基于Huffman编码的原理,利用MATLAB编译出26个英文字母加空格的Huffman码表以及相应的编码和译码程序。
关键词:Huffman,MATLABImplement of Huffman code and decode in MatlabShen Yi-feng(School of Information and Engineering.Shanghai NormalUniversity.Shanghai.200333)Abstract:This article has mainly introduced the theory of Huffman Code and the advantage of this code.Then, we use MATLAB to find the code table for the English alphabet and space based on Huffman Code theory. Finally, we design the code and decode program for these alphabet and space based on the same theory.Key words:Huffman, MATLAB1.引言Huffman编码属于信源编码,由于信源符号之间存在分布不均匀和相关性,致使信源存在冗余度。
因此信源编码的主要任务就是减少冗余,从而提高编码的效率。
信源编码的关键是信息论中的两个基本定理[1]:无失真编码定理和限失真编码定理,其中,无失真编码定理可看成是可逆编码的基础,即当信源符号变换为代码后,可从代码无失真地恢复原信号,本文所研究的Huffman编码即是一种基于无失真编码定理的最佳无失真信源编码2.Huffman编码简介及其优势Huffman 是一种可变字长编码,即编码后信源符号的码长是不一样的,一般而言出现概率高的信源符号码长较短,而出现概率小的信源符号码长较长。
Huffman编码用MTLAB的实现及编码注释一、实验目的1、学习Matlab软件的使用和编程;2、进一步深入理解Huffman编码算法的原理;3、提高独立进行算法编程的能力.二、实验环境硬件:计算机软件:Windows 2003和MATLAB编程环境。
三、实验内容1、用Matlab实现Huffman编码算法程序;2、要求程序输出显示所有的码字以及编码效率;3、设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示用户输入代表信源符号概率的向量;要对用户输入的概率向量进行合法性检查。
四、实验原理1、二进制Huffman编码的基本原理及算法(1)把信源符号集中的所有符号按概率从大到小排队。
(2) 取概率最小的两个符号作为两片叶子合并(缩减)到一个节点.(3)视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队.(4)重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根。
(5) 从根出发,对各分枝标记0和1。
从根到叶的路径就给出了各个码字的编码和码长。
2、程序设计的原理(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。
(2)huffman编码具体实现原理:1>在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。
2〉新生成一个n—1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码:将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补0,概率较大的元素后补1,后面的编码都遵守这个原则)然后对n-i—1的第一、二个元素进行编码,首先在矩阵a中第n-i行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i—1行第一、二个元素的根节点),则矩阵c的第n—i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码,最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n—i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。