[信息论]S.F.E编码的JAVA实现

S.F.E编码的JAVA实现

与哈夫曼编码一样,S. F. E求出的结果也是满足概率大的比概率小的编码短。但是它的期望长度是大于哈夫曼编码的。所以总体来说,S. F. E只是构造起来简单,其性质是不如哈夫曼编码的。

S.F.E编码的理论这里不再给出,相应书籍都有很具体的介绍。下面先给出JAVA代码运行的结果。



                                         



参考文献

1. THOMAS M. COVER, JOY A. THOMAS. Element of Information Theory. Second Edition.


JAVA代码如下。


import java.util.Scanner;

public class SFE {
	public static int N;// // 取值空间元素的个数

	/** 二进制转换 */
	public String[] binary_decimalism(double[] F, double[] p) {
		String[] str = new String[F.length];
		for (int i = 0; i < F.length; i++) {
			str[i] = "";// 起始设为空
			double len1 = -Math.log(p[i]) / Math.log(2);
			int len2 = (int) len1;
			int len = 0;
			if (len1 == len2)
				len = len2 + 1;
			else
				len = len2 + 2;
			for (int j = 0; j < len; j++) {
				if (F[i] * 2 < 1) {
					F[i] = F[i] * 2;
					str[i] = str[i].concat("0");
				} else {
					F[i] = F[i] * 2 - 1;
					str[i] = str[i].concat("1");
				}
			}
		}
		return str;
	}

	public static void main(String[] args) {
		// 输入
		Scanner input = new Scanner(System.in);
		System.out.print("请输入取值空间X中元素的个数:");
		N = input.nextInt();
		String[] str = new String[N];
		System.out.print("请输入取值空间X中的元素名称:");
		for (int i = 0; i < N; i++)
			str[i] = input.next();// 输入取值空间的数据
		double[] p = new double[N];
		double[] F = new double[N];
		double[] F_ = new double[N]; // 用于存放数据
		System.out.print("请输入各个元素的概率:");
		for (int i = 0; i < N; i++)
			p[i] = input.nextDouble();// 输入对应的概率

		/** 求F(x) */
		double num = 0;
		for (int i = 0; i < N; i++) {
			num = num + p[i];
			F[i] = num;
		}

		/** 求F_(x) */
		for (int i = 0; i < N; i++)
			F_[i] = F[i] - 0.5 * p[i];

		SFE en = new SFE();
		String[] Code = en.binary_decimalism(F_, p);

		for (int i = 0; i < N; i++) {
			System.out.println("X为" + str[i] + "时:其S.F.E编码:" + Code[i]);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值