1、云南大学数学与统计学实验教学中心实验报告云南大学数学与统计学实验教学中心实验报告课程名称:计算机网络实验学期:2012-2013学年第二学期成绩:指导教师: 陆正福学生姓名:卢富毓 学生学号:20101910072实验名称:S.F.E编码实验实验要求: 必做实验学时:4学时实验编号: No.6实验日期:2013/3/28完成日期:2013/4/6学院:数学与统计学院专业 : 信息与计算科学年级: 2010级 一、实验目的:通过实验掌握S.F.E编码实验的构造算法,以及其重要思想。二、实验内容: S.F.E编码实验给定概率分布,编程实现S.F.E编码。提示:本算法的关键在于,修正的分布函数是纯小
2、数,可以采用乘基数取整法获得编码。三、实验环境Win7、Eclipse四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1. 预备知识相较于哈夫曼编码、唯一可译码来说,SFE编码是最容易编写以及理解的了。他需要用的函数如下:对于x的概率p(x)0。其累积分布函数为:那么它的修正的累积分布就为:两者关系如图6.1:2. 实验过程A、 原理分析:通过上述函数计算出一个分布值。然后利用二进制表示出来。根据算出来的码长取出来的二进制就是码字具体如下图6.2:xP(x)F(x)Fba(x)Fba(x)的二进制l(x)码字10.250.250.1250.001300120.250.50.375
3、0.011301130.20.70.60.100114100140.150.850.7750.11000114110050.151.00.9250.111011041110B、 具体代码如下:/如6.2,若是将每一行看做是一个对象的话/我们先定义个SFE对象/SFE编码算法整体结构如下结果如下:X=1 2 3 4p(x)=0.25 0.5 0.125 0.125结果如图:X=1 2 3 4 5p(x)=0.25 0.25 0.2 0.15 0.15结果如图:具体代码如下:/* * author 卢富毓 * */package SFE;import java.util.Scanner;/构澡一个
4、SFE的结点对象class SFEobj double Px; /px概率double Fx; /F(x)函数值double Fbax; / Fba(x)double Lx; / 编码长度String Code; /编码/构造方法SFEobj() this.Px = 0;this.Fx = 0;this.Fbax = 0;this.Lx = 0;this.Code =;/求解SFE编码的类public class SFE public static int n; /全局变量定义变量节点的个数public static void main(String args) new SFE().start
5、(); /开始运行/SFE编码计算开始void start() System.out.print(请输入变量节点个数(即变量X):);Scanner in = new Scanner(System.in);n = in.nextInt(); / 变量个数SFEobj sfe = new SFEobjn;for (int i = 0; i sfe.length; i+) sfei = new SFEobj();System.out.print(请输入变量节点值(即变量p(x):);for (int i = 0; i sfe.length; i+) sfei.Px = in.nextDouble(
6、);sfe = SFECode(sfe);Display(sfe);/求解SFE编码的具体算法SFEobj SFECode(SFEobj sfe) double sum = 0;/ 计算F(x)for (int i = 0; i sfe.length; i+) for (int j = 0; j = i; j+) sum = sum + sfej.Px;sfei.Fx = sum;sum = 0;/ 计算Fba(x)for (int i = 0; i sfe.length; i+) if (i = 0) sfei.Fbax = sfei.Px/2; else for (int j = 0; j
7、 i; j+) sum = sum + sfej.Px;sfei.Fbax = sum + sfei.Px/2;sum = 0;/ 计算l(x)for (int i = 0; i sfe.length; i+) sfei.Lx = Math.ceil(Math.log(1 / sfei.Px)/Math.log(2) + 1;/ fba(x)转为二进制for (int i = 0; i 0) k-;l = l * 2;m = l;sfei.Code = sfei.Code + (int)m;if (l = 1) l = l - 1;return sfei.Code;/ 输出函数private
8、void Display(SFEobj sfe) System.out.println(r-得到结果如下-);System.out.println(xtp(x)tF(x)tFba(x)tl(x)tCodeword);for (int i = 0; i sfe.length; i+) System.out.println(i + t + sfei.Px + t + sfei.Fx + t+ String.format(%.3f, sfei.Fbax) + t+ (int) sfei.Lx + t + sfei.Code);System.out.println(-);五、实验总结1遇到的问题及分析:遇到问题:这次没有遇到问题。O(_)O 分析并解决:-2体会和收获。通过对SFE算法的编写,加深了对SFE编码的理解。加强了编程能力。六、参考文献七、教师评语:第 7 页 共 7 页