香农编码熵怎么算_香农范诺编码

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

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

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

一、香农编码的概念

概念:

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

香农编码属于不等长编码,通常将经常出现的消息变成短码,不经常出现的消息编成长码,从而提高通信效率。

二、问题分析

① 由于总是进一取整,香浓编码方法不一定是最佳的。

② 由于第一个消息符号的累加概率总是0,故它对应得分码字总是0、00、000、0……0的式样。

③ 码字集合是唯一的,且为即时码。

④ 先有码长再有码字。

⑤ 对于一些信源,编码效率不高,信源冗余度稍大,因此其实用性受到较大限制。

三、算法实现及流程图

算法基本步骤:

1) 将q个信源符号按概率递减的方式进行排序:P1≥P2≥……Pq。

2) 按式-logP(Si)≤li≤1-logP(Si)(i=1,2,……q),计算出每个信源符号的码长li。  

3) 为编成唯一可译码,计算第i个信源符号的累加概率:。  

4) 将累加概率Gi用二进制表示。  

5) 取Gi对应二进制数的小数点后li位构成该信源符号的二进制码字。

 

四、运行结果

 

五、学习心得

香农编码本质上就是一个信源概率组进行一系列的规则运算后得到的二进制数组。

在用C语言编写的香农编码程序中,对于计算编码时用到的各种概率值要有具体的定义,由于进行香农编码时,首先要进行从大到下的概率排序,所以,程序中编辑的降序的部分是必须的,运行结果不仅要求有编码结果,还要有信源熵,平均码长,所以在程序中也应定义这两个值。通过运用香农编码方法进行计算和对香农编码程序的运行,可知,香农编码方法多余度稍大,相较于其他编码方法实用性不大,但香农编码法有重要的理论意义。

package cn.com;

import java.io.Externalizable;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Scanner;

public class Shannon {


/**


* 将概率从大到小排序


* @param p 输入的概率数组


* @return 


*/


public double[] Sort(double[] p){


double[] p1 = new double[p.length];


for(int i = 0; i < p1.length; i++){


p1[i] = p[i];


}


Arrays.sort(p1);


for(int i = 0, j = p.length-1; i < p.length/2; i++, j–){


double temp = p1[i];


p1[i] = p1[j];


p1[j] = temp;


}


return p1;


}





/**


* 验证概率和是否为1,合格为true,否则false


* @param p 输入的概率数组


* @return


*/


public boolean varification(double[] p){


boolean bool = false;


double d = 0;


for(int i = 0; i < p.length; i++){


d+=p[i];


}


if(d – 1.0 < 0.000001){


return true;


}


return bool;


}





/**


* 计算每个信源的码长


* @param p 信源的概率


* @return


*/


public int[] codeLength(double[] p){


int[] Li = new int[p.length];


double temp = 0;


for(int i = 0; i < Li.length; i++){


temp = – (Math.log(p[i]) / Math.log(2.0));


Li[i] = (int)Math.ceil(temp);


}


return Li;


}





/**


* 计算信源的熵


* @param p 信源的概率数组


* @return


*/


public double entropyAll(double[] p){


double H = 0;


for(int i = 0; i < p.length; i++){


H-=(p[i] * (Math.log(p[i]) / Math.log(2.0)));


}





return H;


}





/**


* 计算平均码长


* @param p 信源的概率数组


* @param Li 每个信源的码长数组


* @return


*/


public double averageCodeLength(double[] p, int[] Li){


double n = 0;


for(int i = 0; i < p.length; i++){


n+=p[i] * Li[i];


}





return n;


}





/**


* 计算累加概率


* @param p 信源的概率数组


* @return


*/


public double[] accumulation(double[] p){


double[] q = new double[p.length];


q[0] = 0;





for(int i = 1; i < p.length; i++){


q[i] = q[i-1] + p[i-1];


}


return q;


}





/**


* 计算二进制编码


* @param acl 累加概率数组


* @param cl 每个信源的码长数组


* @return


*/


public int[][] binaryMode(double[] acl, int[] cl){


int[][] c = new int[acl.length][];


for(int i = 0; i < acl.length; i++){


c[i] = new int[cl[i]];


}





double[] a = new double[acl.length+1];


for(int i = 0; i < acl.length; i++){


for(int j = 0; j < cl[i]; j++){


if(j == 0){


a[j] = acl[i] * 2;


}else{


a[j] = a[j-1] * 2;


}


if(a[j] > 1){


c[i][j] = 1;


a[j] = a[j] – 1;


}else{


c[i][j] = 0;


}


}


}





return c;


}








public static void main(String[] args) {


Scanner sc = new Scanner(System.in);


Shannon t = new Shannon();


System.out.println(“输入信源的个数:”);


int num = sc.nextInt();


double[] p = new double[num];


System.out.println(“输入概率:”);


for(int i = 0; i < p.length; i++){


p[i] = sc.nextDouble();


}


if(!t.varification(p)){


System.out.println(“输入的概率有误!”);


return;


}


double[] q = t.Sort(p);





int[] cl = t.codeLength(p);





double[] acl = t.accumulation(p);


int[][] c = t.binaryMode(acl, cl);


System.out.println(“概率              香农编码”);


for(int i = 0; i < p.length; i++){


System.out.print(q[i]+”—>”);


for(int j = 0; j < cl[i]; j++){


System.out.print(c[i][j]);


}


System.out.println();


}


double avg = t.averageCodeLength(p, cl);


double ea = t.entropyAll(p);


System.out.println(“平均码长为:”+avg);


System.out.println(“信源的信息熵为:”+ea);


System.out.println(“编码效率为”+ea/avg);





}

}

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195176.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 时间戳转换日期格式 linux_date命令设置时间

    时间戳转换日期格式 linux_date命令设置时间1.查看指定时间的时间戳 查看当前时间 #date+%s 查看指定时间 #date-d2008-01-01+%s  1199116800 #date-d20080101+%s 1199116800 2.将时间戳转换成date #date-d’1970-01-01UTC1199116800seconds’ 2008年01月01日星期二00:00:00CST #exp…

  • linux平均负载什么意思_负荷率和负载率一样吗

    linux平均负载什么意思_负荷率和负载率一样吗1,Linux系统的平均负载是什么?特定时间间隔内运行队列中的平均进程数,好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行2,什么是”进程队列”?一个进程满足以下条件就会位于进程队列中1,它没有在等待I/O操作的结果2,它没有主动进入等待状态(即没有调用wait)3,它没有被停止3,如何查看平均负载?最简单的命令是uptime例子:[www.linuxidc.com@localho…

  • out of memory解决方法(python慢的原因)

    折腾了一整天又换电脑又重装系统重装各种软件插件 最后发现outofmemory只是因为少写了一行代码 内心的崩溃无法用语言形容 虽然本来是乌龙一场但是这个过程中解决问题get一些新技能 也不能说完全没有收获【一个大写的心理安慰】开始我的4G小笔记本outofmemory之后,我换了一个32G内存的电脑 各种重装系统折腾半天好不容易都装好了程序可

  • Word在试图打开文件时遇到错误请尝试下列方法 *检查文档或驱动器的文件权限*确保有足够的内存和磁盘空间,…[通俗易懂]

    Word在试图打开文件时遇到错误请尝试下列方法 *检查文档或驱动器的文件权限*确保有足够的内存和磁盘空间,…[通俗易懂]可能存在两种可能:下载保存过程中,该文件损坏,导致无法打开;文件安全性问题,可以打开Word2013或Excel2013,依次点击“文件→选项→信任中心→信任中心设置→受保护的视图”,取消受保护的视图标签下的三个复选框的勾选,或者通过简单的操作解除某个文件的锁定。右键点击您的Word文档并点击属性,在文件的属性窗口中,点击“解除锁定。 转载于:https://b…

  • Python使用UDP实现720p视频传输「建议收藏」

    使用UDP完成720p以上高清视频传输1.项目背景2.解决方案3.实现细节3.1TCP/UDP的选择3.2图片分片算法3.3JPG压缩3.4接收队列4.遇到的坑及解决办法4.1.Windows防火墙4.2.路由器网络频段4.3.Wifi配置4.4.硬件瓶颈4.5.OpenCV读取摄像头大坑4.6.Socket卡顿5.尚未BugFree的功能5.1使用TCP回传帧率…

  • python读取txt中的一列称为_python读取txt文件并取其某一列数据的示例

    python读取txt中的一列称为_python读取txt文件并取其某一列数据的示例python读取txt文件并取其某一列数据的示例菜鸟笔记首先读取的txt文件如下:AAAAF1100003E8180003E1FC0003E7700003FFFC90AAAAF1100003E8240003E2080003E76C0003FFFCA5AAAAF1100003E8140003E2040003E7600003FFFC85AAAAF1100003E7F0…

发表回复

您的电子邮箱地址不会被公开。

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