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]);
}
}
}