使用链表编写的香农编码

内容与设计思想

  首先建立信源的数据存储类 class DATA ,按照教材方式建立数据成员变量.设有离散无记忆信源 X,P(X) .二进制香农编码为: 1. 将信源符号按概率从大到小的顺序排列 2. P(X0)=0, P(Xj) 表前面概率的累加概率,最后该信源的码字将用此值表示 3. Ki 为第 I 个码字的长度,确定整数 Ki 满足不等式: -log2 P(Xi)<=Ki<1- log2 P(Xi) 4. P(Xj) 用二进制表示,并取小数点后Ki位作为符号 X 的编码.
  在信源输入时完成对信源中 P(Xi) P(Xj) Ki 的计算,然后把信源数据赋给算码字的函数 a 进行码字计算.码字计算完毕后会将结果返回给输入信源中的 key 元素,每个信源即得到自己的香农编码

  香农编码比较定长编码有更高的效率,因为它对信源进行了压缩.

#include  " iostream.h "
#include 
" math.h "
class  DATA // 数据类
{
public:
DATA()
{next=NULL;qian=NULL;}
char Xi;
char* key;
float PXi,PXj;
int Ki;
DATA 
*next,*qian;
}
;

void  a(DATA  * p) // 算码字
{
int l=0,y=p->Ki;
char* L=new char[y];
float z=p->PXj;
    
while(y>0)
    
{
    z
=z*2;
        
if(z>=1)//->字符0.1
        {z=z-1;
        L[l]
='1';}

        
else L[l]='0';
    l
++;
    y
--;
    }
//此时得到编码数组L
p->key=L;//赋给信源数组
}


void  main()
{int l;
float z,y=0;
char L;
DATA 
*p=new DATA;//ini
DATA *head=p;//ini
    while(1)
    
{cout<<"1.编码"<<endl<<"2.结束程序"<<endl;
    cin
>>l;
    
if(l>=2break;
        
switch(l)//选择
        {
            
case 1:{//输入信源排序并编码
                cout<<"分别输入Xi与PXi的值,PXi的值输入9表示输入结束"<<endl;
                    
while(1)
                    
{
                    cout
<<"Xi的值:";
                    cin
>>L;
                    cout
<<"PXi的值:";
                    cin
>>z;
                    
if(z==9break;
                    p
->Xi=L;//赋值
                    p->PXi=z;
                    
if(p->qian==NULL) p->PXj=0;
                    
else {p->PXj=p->qian->PXi+p->qian->PXj;}//!
                    p->Ki=int(0.999-log10(z)/log10(2));
                    p
->next=new DATA;
                    p
->next->qian=p;
                    p
=p->next;
                    }
//到此完成对信源的输入及初始计算
                    for(p=head;p->next!=NULL;p=p->next)
                    
{
                    a(p);
                    cout
<<p->key;//输出编码
                    }

                cout
<<endl;
                
break;
                   }

        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值