输入: 大写字符串+下划线的集合,下划线代表空格。
输出: ASCII 编码所需二进制长度,哈夫曼编码后长度, 压缩率(前者除以后者),遇到 END 终结。
输入样例
AAAAABCD
THE_CAT_IN_THE_HAT
END
输出样例
64 13 4.9
144 51 2.8
最佳无前缀可变长度编码就是哈夫曼编码。首先根据字符串统计每个字符出现的频率,然后按照频率构造哈夫曼树,计算总的编码长度。
package tree;
import java.util.PriorityQueue;
import java.util.Scanner;
public class poj1521 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int a[] = new int[100];
String s = scanner.next();
if (s.equals("END")) {
return;
}
int n = s.length();
for (int i = 0; i < n; i++)
if (s.charAt(i) == '_')
a[26]++;
else
a[s.charAt(i) - 'A']++;
PriorityQueue<Integer> q = new PriorityQueue<>();
for (int i = 0; i <= 26; i++)
if (a[i] != 0)
q.add(a[i]);
int ans = n;
while (q.size() > 2) {
int t, t1, t2;
t1 = q.peek();
q.poll();
t2 = q.peek();
q.poll();
t = t1 + t2;
ans += t;
q.add(t);
}
System.out.println("ASCII编码:" + (n * 8));
System.out.println("熵编码:" + ans);
System.out.println("压缩比:" + (double) n * 8 / ans);
}
}
}
绿色为输入,白色为输出。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/125344172
内容来源于网络,如有侵权,请联系作者删除!