首页 > 编程知识 正文

香农编码实验报告,香农编码的用途

时间:2023-05-05 00:17:20 阅读:61150 作者:998

使用的数据结构是双向链表。

环境: dev-c 5.11

对某个离散无存储的源实现香农编码,输出消息符号及其对应的码字。

假设离散地没有存储器资源:

二进制香农的编码过程如下。

1 .将来自发起方的n个消息符号按照其概率从高到低的顺序排列。

2 )如下式计算第I个信息的二进制码群的码长,进行整形。

3、为了创建唯一可读消息,首先计算第I条消息的累积概率

4、累积概率Pi (小数)取二进制

5、去掉小数点,根据码长li,把小数点后li位作为第I条信息的码字。

((-lb=li-lb 1 ) ) ) ) ) ) ) )。

实现结果:

代码:

# include stdio.h # include string.h # include stdlib.h # include math.hstructxiangnong { intnum; 浮点p; //概率float pre_p; //累积概率; 结构乡无*下一步,*pre; (; //码字voidmazi(floatpre_p,double p ) {int i=0; int r[9]; int mazi_chang; //代码长度while((pre_p-int ) pre_p ) )!=0i9 ) {pre_p=pre_p*2; r[I]=int(pre_p ); if(pre_p=1) pre_p=pre_p-1; I; }Mazi_Chang=int(-log(p )/log(2)2)1); //-lb(p )=符号长度-lb ) p ) 1if ) pre_p==0) for ) I=0; imazi_chang; I ) )//输出每个概率的代码r[i]=0; printf('%d ',r[i] ); }elsefor(I=0; imazi_chang; I ) printf('%d ',r[i]; printf (' ); } int main ((structxiangnong * head=) structxiangnong * (malloc ) sizeof ) structxiangnong ) ); structxiangnong * q=(structxiangnong * ) malloc ) sizeof (structxiangnong ); 结构乡弄* Q1,*s; q1=head; 头下一步=q; 问前=head; 头前=空; q-pre_p=0; 头编号=0; int i,ss; printf((n香农编码开始………………………………………(n () ); printf ('请输入离散的无内存源数:'); scanf('%d ',ss ); printf((n请按概率从低到高的顺序输入离散无记忆源(n ) ); for(I=0; iss; I )扫描(' % f ',q-p ); q-num=q-pre-num 1; while((Q1-next-num ) ) q-num ) ) /累积概率) qq-pre_p )-pre_p ) q1-next-p ); q1=q1-next; ) } q1=head; s=(structxiangnong* ) malloc ) sizeof (structxiangnong ); q-next=s; s-pre=q; q=s; s-num=0; s-pre_p=0; }printf (累积概率分别为(n ) ); while (Q1 -下一个编号!=0) printf('%.2f ',q1-next-pre_p ); q1=q1-next; //代码q1=head; printf(nn每个概率代码为n ); while (Q1 -下一个编号!=0) Mazi(Q1-next-pre_p,双精度) Q1-next-p ); q1=q1-next; (printf((n(n香农编码结束………………………………(n ) ); 返回0; } 参考:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。