c语言实现香农编码和译码_香农编码码长

c语言实现香农编码和译码_香农编码码长1、设计思想     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。2、设计流程     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。    主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个…

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

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

1、设计思想

     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。

2、设计流程

     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。

     主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个函数计算前几个符号概率的累加;第三个函数计算每个符号码字长度;第四个函数将累加概率转换为二进制。各个函数分工完成的话,问题就变得简单多了。

    我们来简单绘制一下其流程图:

    c语言实现香农编码和译码_香农编码码长

3、设计程序

#include <stdio.h>
#include <math.h>
#include <string.h>
int i,j,n,k,b;
float a;
char bitw[20];

 struct shan
 {
	char s[20];
  	float p;
  	float pa;
  	float l_f;
  	int l;
  	char w[20];
 }data[12];

void sequ(struct shan x[],int n)
{
 	struct shan temp;
 	for(i=0;i<n;i++)
	for(j=i;j<n;j++)
  {
  	if(x[i].p<x[j].p)
   {
  		temp=x[j];
 		x[j]=x[i];
  		x[i]=temp;
   } 
  }
}

void countpa(struct shan x[],int n)
{ 
  	a=0;
	x[0].pa=0;
  	for(i=0;i<n;i++)
  	{
 		a+=x[i].p;
 		x[i+1].pa=a;
  	}
}

void count_l(struct shan x[],int n)
{
	for(i=0;i<n;i++)
 	{
 		x[i].l_f=-log(x[i].p)/log(2);
    	if((x[i].l_f-(int)x[i].l_f)>0) 
  		{
  			x[i].l=(int)x[i].l_f+1;	
		}
 		else x[i].l=(int)x[i].l_f;
  	}
}

void covbit(float d,int lc)
{
  	for(j=0;j<lc;j++)
  	{  
  	 	b=(int)(d*2);
   		bitw[j]=b+48;
   		d=2*d-int(d*2);
  	}
 }

main()
{
	printf("please input the number of symbols of source(n<=10):n=");
 	scanf("%d",&n);
 	printf("please input the the source symbols and their probabilities\n");
 	for(i=0;i<n;i++)
 	{
 		scanf("%s",data[i].s);
 	}
 	for(i=0;i<n;i++)
 	{
	 	printf("P(%s)=",data[i].s);
		scanf("%f",&data[i].p);
 	}
 	sequ(data,n);
 	countpa(data,n);
 	count_l(data,n);
 	for(i=0;i<n;i++)
	{
 		covbit(data[i].pa,data[i].l);
 		strcpy(data[i].w,bitw);
 	}
 	for(i=0;i<n;i++)
 	printf("p(%s)=%f padd=%f l=%d w=%s\n",data[i].s,data[i].p,data[i].pa,data[i].l,data[i].w);
}

4、设计结果

 c语言实现香农编码和译码_香农编码码长

参考:https://blog.csdn.net/keyhn/article/details/5185806

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 核与线程 CPU 4核8线程 的解释

    核与线程 CPU 4核8线程 的解释1 物理 CPU 物理 CPU 就是计算机上实际配置的 CPU 个数 在 linux 上可以打开 cat proc cpuinfo 来查看 其中的 physicalid 就是每个物理 CPU 的 ID 能找到几个 physicalid 就代表计算机实际有几个 CPU 在 linux 下可以通过指令 grep physicalid proc cpuinfo sort u wc l 来查看物理

    2025年7月22日
    2
  • HTTP 304状态码的详细讲解

    HTTP304错误状态码的详细讲解304缓存策略及实现网页web常见状态码:200,301,302,304,400,401,404,500

    2022年4月4日
    61
  • MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」

    MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法时间差函数TIMESTAMPDIFF、DATEDIFF的用法我们在写sql语句,尤其是存储过程中,会频繁用到对于日期、时间的比较和判断,那么对于这两个时间差比较函数用法做一个举例介绍。datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。–相差2天selectdatediff(‘2018-03-2209:…

    2022年6月13日
    43
  • Java集合详解(超详细)

    Java集合详解(超详细)这里写目录标题一、集合框架的概述二、Collection接口(一)常用方法(二)Iterator迭代器接口(三)JDK5.0新特性–增强for循环:(foreach循环)三、Collection子接口:List接口一、集合框架的概述集合与数组存储数据概述:集合、数组都是对多个数据进行存储操作的结构,简称Java容器。说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)数组存储的特点:一旦初始化以后,其长度就确定了。数组一旦

    2022年5月25日
    31
  • WDA Architecture

    WDA Architecture忙了一阵子,把我学习WD的计划打乱了,今天终于有点时间可以开学了,先转篇网文先.原文地址:http://moonroom1.spaces.live.com/blog/cns!7578AFCD9C32F7B1!443.ent…

    2022年7月14日
    14
  • 【机器学习中的数学】多项式分布及其共轭分布

    【机器学习中的数学】多项式分布及其共轭分布多项变量(MultinomialVariables)二元变量是用来描述只有两种可能值的量,而当我们遇到一种离散变量,其可以有K种可能的状态。我们可以使用一个K维的向量x表示,其中只有一维xk为1,其余为0。对应于xk=1的参数为μk,表示xk发生时的概率。其分布可以看做是伯努利分布的一般化。现在我们考虑N个独立的观测D={x1,…,xN},得到其似然函数。如图:

    2022年10月11日
    0

发表回复

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

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