香农编码的gui编码_香农编码

香农编码的gui编码_香农编码香农编码概念:香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

香农编码

概念:

香农编码是是采用信源符号的累计概率分布函数来分配字码的。香农编码是根据香农第一定理直接得出的,指出了平均码长与信息之间的关系,同时也指出了可以通过编码使平均码长达到极限值。香农第一定理是将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。

香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。 香农编码严格意义上来说不是最佳码,它是采用信源符号的累计概率分布函数来分配码字。

编码步骤如下:

(1)将信源符号按概率从大到小顺序排列。

(2)计算第i个符号对应的码字的码长(取整);

(3) 计算第i个符号的累加概率 ;

(4)将累加概率变换成二进制小数,取小数点后 位数作为第i个符号的码字。

可以看出,编码所得的码字,没有相同的,所以是非奇异码,也没有一个码字是其他码字的前缀,所以是即时码,也是唯一可译码。

特点:

香农编码的效率不高,实用性不大,但对其他编码方法有很好的理论指导意义。一般情况下,按照香农编码方法编出来的码,其平均码长不是最短的,即不是紧致码(最佳码)。只有当信源符号的概率分布使不等式左边的等号成立时,编码效率才达到最高。

香农编码

1.根据步骤截取核心代码:

ab24772420da6f1f08f23c12faaa3f3d.png将信源符号按概率从大到小顺序排列

ac53fb102245ec61df23c42b4a2ee753.png计算符号的累加概率,取小数点后特定位数作为第i个符号的码字

bc1ea2dc866e918dc1e81a7985a45074.png将累加概率变换成二进制小数

2.验证编码效率是100%的情况(0.5,0.25,0.125,0.125)

d6612cb4be252d3305b8d24dc68493de.png

3.事例1(0.25,0.25,0.2,0.15,0.1,0.05)

e153ca4c285a652c68c7e96ade56006a.png

4.事例2(0.20,0.19,0.18,0.17,0.15,0.10,0.01)做对比(平均码长,编码效率)

ba962971f0cf576e2f3a5b20749c79bf.png

代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

struct Node

{

int num;

double p,pa;

int L;

int x[100];

};

Node box[20];

int M;

double H,L,K;

int exit1,exit2;

void draw()

{

int i,j,k,posx,posy;

cleardevice();

setlinecolor(BLACK);

settextcolor(BLACK);

for(i=1;i<=M;i++){

posx=10;

posy=M*50;

k=50;

for(j=0;j

if(box[i].x[j]==1){

line(posx,posy,posx+k,posy-k);

outtextxy(posx+k/2,posy-k/2+2, _T(“1”));

posx+=k;

posy-=k;

}

else{

line(posx,posy,posx+k,posy);

outtextxy(posx+k/2-4,posy+1, _T(“0”));

posx+=k;

}

k/=1.05;

}

}

}

void initialization()

{

int i,j,k;

initgraph(501,550,SHOWCONSOLE);

setbkcolor(WHITE);

cleardevice();

M=6;

box[0].p=0;

box[1].p=0.25;

box[2].p=0.25;

box[3].p=0.20;

box[4].p=0.15;

box[5].p=0.1;

box[6].p=0.05;

}

void carry()

{

int i,j,k;

initialization();

exit1=0;

while(exit1==0){

for(i=0;i<=M;i++){

box[i].pa=0;

}

for(i=1;i<=M;i++){

box[i].pa=box[i-1].pa+box[i-1].p;

box[i].L=0;

while(box[i].L

box[i].L++;

}

}

H=0;

for(i=1;i<=M;i++){

H-=box[i].p*log(box[i].p)/log(2);

}

L=0;

for(i=1;i<=M;i++){

L+=box[i].p*box[i].L;

}

K=0;

for(i=1;i<=M;i++){

K+=pow(0.5,box[i].L);

}

for(i=1;i<=M;i++){

cout<

cout<

cout<

cout<

for(j=0;j

box[i].pa*=2;

if(box[i].pa>=1){

box[i].x[j]=1;

box[i].pa-=1;

}

else{

box[i].x[j]=0;

}

cout<

}

cout<

}

cout<

cout<

cout<

cout<

if(K<=1)cout<

else cout<

draw();

cout<

_getch();

system(“cls”);

cout<

M=0;

while(M<3||M>10){

cin>>M;

}

cout<

for(i=1;i<=M;i++){

cout<

box[i].p=0;

while(box[i].p<=0||box[i].p>=1){

cin>>box[i].p;

}

}

for(i=0;i

for(j=1;j

if(box[j].p

box[11].p=box[j+1].p;

box[j+1].p=box[j].p;

box[j].p=box[11].p;

}

}

}

system(“cls”);

}

}

int main()

{

carry();

}

演示视频:

500a38b5e598aa99ebecdfdda10a89ad.gif

接下来这些是信息论的大作业,三种无失真编码,只编了二元码,我要稍微详细说说过程,一般编之前肯定是找算法,概念,再在纸上像大纲一样从头到尾列出实现的或详或略的代码。

香农编码作为最简单的是可以根据老师ppt给的算法直接完成的,包括:概率排序,累加概率,由概率算码字长度,由累加概率编码即可,清晰明白。

如果编多(m)元码,我猜测,由概率算码字长度这一步要将log2为底改成logm为底,由累加概率编码这一步要将乘2取整再剪整数部分改为乘m取整再剪整数部分。

算术编码作为限失真编码,我感觉很像香农编码,如果符号序列因为各种原因未出现某符号,两者才会有区别。

ppt:

abb3875470495b079405287ee849f99b.png

6373c2cebc810f4aca25e24a949fd90f.png

7a00dd366234210e9011d66b8295d209.png

658bcb72d13bf88c0c9c85000b7da9ef.png

79040b92e7fe87fa408d3dbc69736ebe.png

8a40591fab294d03de8ef259f1e58381.png

dbd06d610ea8a3da4277ad2ea3f01fc3.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195031.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月25日 上午10:43
下一篇 2025年10月25日 上午11:15


相关推荐

  • css float属性用法_不属于float的常用属性

    css float属性用法_不属于float的常用属性clear:both表示不允许左右两边的floatclear:left表示不允许左边floatclear:right表示不允许右边float

    2025年8月30日
    9
  • 数组splice_数组concat方法

    数组splice_数组concat方法有三个方法经常会混淆,但是了解它后你会发现很好区分splice方法是数组特有的方法spite方法是字符串特有的方法slice方法是字符串和数组共同都有的方法这里介绍下数组的常用方法数组的splice方法splice()函数用于从当前数组中移除一部分连续的元素。如有必要,还可以在所移除元素的位置上插入一个或多个新的元素。该函数以数组形式返回从当前数组中被移除的元素。该…

    2026年3月10日
    5
  • Ubuntu 使用Compiz配置炫酷3D桌面

    Ubuntu 使用Compiz配置炫酷3D桌面先看一下效果要实现这种3D的效果其实很简单.Step1:安装N卡驱动工具sudoapt-getinstallnvidia-331这个东西其实没有太大的作用.Step2:安装Compizsu

    2022年7月2日
    27
  • PDF文档免费转成Word文档,不限页数。

    PDF文档免费转成Word文档,不限页数。链接:https://download.csdn.net/download/auspicious_air/10942678断网状态下输入序列号Name:SolidConverterPDFv9E-mail:user@ru.ruOrganization:anyUnlockCode:KTGK

    2022年4月28日
    62
  • Matlab读取txt数据的实用方法[通俗易懂]

    Matlab读取txt数据的实用方法[通俗易懂]需求有个朋友需要我帮忙写个matlab脚本读取100个txt文档的实验数据,这些文档的结构相同,分为四列,从第一列到第四列依次是时间、位置、速度、加速度。读取完数据之后需要对数据进行处理,具体的处理方式是:提取以0.002为采样周期的数据,分类存储起来。文件内容是这样的:技术难点技术难点在于,这些文件中的数据是从一个软件中仿真得到的,由于采用的是变步长仿真,因此采样时间不统一,很难采用对…

    2025年9月22日
    8
  • idea2021.2.3激活码永久破解方法

    idea2021.2.3激活码永久破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    314

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号