信息道容量的迭代算法c语言,实验1道容量的迭代算法

《实验1道容量的迭代算法》由会员分享,可在线阅读,更多相关《实验1道容量的迭代算法(15页珍藏版)》请在人人文库网上搜索。

1、信息论基础实验指导老师:贺正芸 班级:信息工程081姓名:卢慈荣学号:湖南工业大学电气与信息工程学院实验一 信道容量的迭代算法程序设计一、实验目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握C语言数值计算程序的设计和调试技术。二、实验要求(1)已知:信源符号个数r、信宿符号个数s、信道转移概率矩阵P。(2)输入:任意的一个信道转移概率矩阵。信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。(3)输出:最佳信源分布P*,信道容量C。三、信道容量迭代算法1:procedure CHANNEL CAPACITY(r,s,()2:initiali。

2、ze:信源分布=1/r,相对误差门限,C=3:repeat4:5:6:C 7:until 8:output P*= ,C9:end procedure -四、实验代码/*问题:初始最大容量的设定exp的精确求解 */#include#include#include#include#include#define R 1000#define S 1000#define delta 1e-2#define inf 1e6using namespace std;double P_iR,P_jiSR,Thi_ijRS;double Pre_C,Now_C;int r,s,Num; double __lo。

3、g2(double a) return log(a)/log(2);double __exp(double a)return pow(2.9045 ,a);int eps( double a)if(adelta|a=delta)for(i=0;idelta)P_ii+=P_jiji*__log2(Thi_ijij);P_ii=__exp(P_ii);sum+=P_ii;if(fabs(sum)=delta) for(i=0;i#include #include struct stringschar *string;struct strings *next;struct strings Fstr。

4、, *Fh, *FP;/输出当前集合void outputstr(strings *str)docoutstringnext;while(str);coutb?b:a; inline int MAX(int a, int b) return ab?a:b; #define length_a (strlen(CP)#define length_b (strlen(tempPtr)/判断一个码是否在一个码集合中,在则返回0,不在返回1int comparing(strings *st_string,char *code)while(st_string-next)st_string=st_strin。

5、g-next;if(!strcmp(st_string-string,code)return 0;return 1;/判断两个码字是否一个是另一个的前缀,如果是则生成后缀码void houzhui(char *CP,char *tempPtr)if (!strcmp(CP,tempPtr)coutnext=NULL;cp_temp-string=new charabs(length_a-length_b)+1; char *longstr;longstr=(length_alength_b ? CP : tempPtr);/将长度长的码赋给longstr/取出后缀for (int k=MIN(。

6、length_a,length_b); kstringk - MIN(length_a,length_b)=longstrk;cp_temp-stringabs(length_a-length_b)=NULL;/判断新生成的后缀码是否已在集合F里,不在则加入F集合if(comparing(Fh,cp_temp-string)FP-next=cp_temp;FP=FP-next;void main()/功能提示和程序初始化准备coutstring=new charstrlen(c);strcpy(Ch-string, c);Ch-next=NULL;char f=F :;Fh-string=ne。

7、w charstrlen(f);strcpy(Fh-string, f);Fh-next=NULL;/输入待检测码的个数int Cnum;coutCnum;couttempstr; CP-next=new (struct strings);CP=CP-next;CP-string=new charstrlen(tempstr) ;strcpy(CP-string, tempstr);CP-next = NULL;outputstr(Ch);CP=Ch;while(CP-next-next)CP=CP-next;tempPtr=CP;dotempPtr=tempPtr-next;houzhui(。

8、CP-string,tempPtr-string);while(tempPtr-next);outputstr(Fh);struct strings *Fbegin,*Fend;Fend=Fh;while(1)if(Fend = FP)coutnext)CP=CP-next;tempPtr=Fbegin;for(;)tempPtr=tempPtr-next;houzhui(CP-string,tempPtr-string);if(tempPtr = Fend)break;outputstr(Fh);/输出F集合中全部元素4.输入、输出结果:例1:输入: 唯一可译码的判断!输入待检测码的个数:5。

9、输入待检测码1 :xx2 :xz3 :y4 :zz5 :xyzC :xxxzyzzxyzF :是唯一可译码码组!Press any key to continue实验三 Huffman 编码方案程序设计一、实验目的(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。二、实验要求(1)输入:信源符号个数r、信源的概率分布P;(2)输出:每个信源符号对应的Huffman编码的码字。三、算法1、从键盘输入组成信源C的字符个数N;2、从键盘输入信源C和组成信源的字符所对应的概率数组P;3、用函数来对信源进行二进制编码;先对P按从大到小进行排序,与此同时要把C中相应的字符的。

10、位置做相应的调换;用数组来记录编码:在进行记录编码时是从数组的最后一个开始存储的,而且,每进行一次编码所记录下来的两个编码是按从数组的最后一个元素开始服从countm-k-j、countm-k-j-1,其中k表示编码所进行的次数,j表示每次编码都只有;最后用函数来输出编码。四、代码#include #include #include int m,s1,s2; typedef struct unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree; /动态分配数组存储哈夫曼树 typedef char 。

11、*HuffmanCode; /动态分配数组存储哈夫曼编码表 void Select(HuffmanTree HT,int n) int i,j; for(i = 1;i HTi.weight)&(!HTi.parent)&(s2!=i)s1=i; for(j = 1;j HTj.weight)&(!HTj.parent)&(s1!=j)s2=j; void HuffmanCoding(HuffmanTree &HT, HuffmanCode HC, int *w, int n) / 算法6.13 / w存放n个字符的权值(均0),构造哈夫曼树HT, / 并求出n个字符的哈夫曼编码HC int 。

12、i, j; char *cd; int p; int cdlen; if (n=1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc(m+1) * sizeof(HTNode); / 0号单元未用 for (i=1; i=n; i+) /初始化 HTi.weight=wi-1; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; for (i=n+1; i=m; i+) /初始化 HTi.weight=0; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; puts(n哈夫曼树的构。

13、造过程如下所示:); printf(HT初态:n 结点 weight parent lchild rchild); for (i=1; i=m; i+) printf(n%4d%8d%8d%8d%8d,i,HTi.weight, HTi.parent,HTi.lchild, HTi.rchild); printf( 按任意键,继续 .); getchar(); for (i=n+1; i=m; i+) / 建哈夫曼树 / 在HT1.i-1中选择parent为0且weight最小的两个结点, / 其序号分别为s1和s2。 Select(HT, i-1); HTs1.parent = i; HTs。

14、2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight + HTs2.weight; printf(nselect: s1=%d s2=%dn, s1, s2); printf( 结点 weight parent lchild rchild); for (j=1; j=i; j+) printf(n%4d%8d%8d%8d%8d,j,HTj.weight, HTj.parent,HTj.lchild, HTj.rchild); printf( 按任意键,继续 .); getchar(); /-无栈非递归遍。

15、历哈夫曼树,求哈夫曼编码 cd = (char *)malloc(n*sizeof(char); / 分配求编码的工作空间 p = m; cdlen = 0; for (i=1; i=m; +i) / 遍历哈夫曼树时用作结点状态标志 HTi.weight = 0; while (p) if (HTp.weight=0) / 向左 HTp.weight = 1; if (HTp.lchild != 0) p = HTp.lchild; cdcdlen+ =0; else if (HTp.rchild = 0) / 登记叶子结点的字符的编码 HCp = (char *)malloc(cdlen+1。

16、) * sizeof(char); cdcdlen =0; strcpy(HCp, cd); / 复制编码(串) else if (HTp.weight=1) / 向右 HTp.weight = 2; if (HTp.rchild != 0) p = HTp.rchild; cdcdlen+ =1; else / HTp.weight=2,退回退到父结点,编码长度减1 HTp.weight = 0; p = HTp.parent; -cdlen; / HuffmanCoding void main() HuffmanTree HT;HuffmanCode *HC;int *w,n,i; put。

17、s(输入结点数:); scanf(%d,&n); HC = (HuffmanCode *)malloc(n*sizeof(HuffmanCode); w = (int *)malloc(n*sizeof(int); printf(输入%d个结点的权值n,n); for(i = 0;i n;i+) scanf(%d,&wi); HuffmanCoding(HT,HC,w,n); puts(n各结点的哈夫曼编码:); for(i = 1;i = n;i+) printf(%2d(%4d):%sn,i,wi-1,HCi); getchar(); 四、运行结果输入节点数 5五个节点权值:51 23 21 3 75五、实验总结本实验使用c语言编写,用Huffman函数来对信源进行二进制编码,由于对Huffman比较熟悉,编写起来也比较简单,程序先对P按从大到小进行排序,与此同时要把C中相应的字符的位置做相应的调换,本实验很好的复习了Huffman的内容,对于信息论与编码的巩固也有很大的好处,同时也是对C使用技巧的提高。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值