Java编写哈夫曼编码,要求输入待编码的个数、输入符号、输入各符号的概率
时间: 2024-03-07 11:46:27 浏览: 26
好的,我可以帮你解决这个问题。你需要使用哈夫曼编码来压缩数据,是吗?
以下是Java编写哈夫曼编码的基本思路:
1. 创建一个节点类,包含符号、频率、左右子节点和编码字符串等属性;
2. 创建一个优先队列,用来存储所有的节点;
3. 将输入的符号和概率存储在一个Map中;
4. 将每个符号和概率对应的节点插入到优先队列中;
5. 从队列中取出两个频率最小的节点,合并成一个新节点,并将新节点插入到队列中;
6. 重复步骤5,直到队列中只剩下一个节点;
7. 遍历哈夫曼树,生成每个符号对应的编码字符串;
8. 将编码字符串输出。
下面是Java代码实现:
```java
import java.util.*;
public class Huffman {
// 节点类
private static class Node implements Comparable<Node> {
char symbol;
double frequency;
Node left, right;
public Node(char symbol, double frequency) {
this.symbol = symbol;
this.frequency = frequency;
}
public Node(double frequency, Node left, Node right) {
this.frequency = frequency;
this.left = left;
this.right = right;
}
public boolean isLeaf() {
return left == null && right == null;
}
// 比较方法,用于优先队列
public int compareTo(Node other) {
return Double.compare(this.frequency, other.frequency);
}
}
// 生成哈夫曼树
private static Node buildHuffmanTree(Map<Character, Double> frequencies) {
PriorityQueue<Node> pq = new PriorityQueue<>();
for (char symbol : frequencies.keySet()) {
pq.add(new Node(symbol, frequencies.get(symbol)));
}
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
pq.add(new Node(left.frequency + right.frequency, left, right));
}
return pq.poll();
}
// 生成编码表
private static Map<Character, String> buildCodeTable(Node root) {
Map<Character, String> codes = new HashMap<>();
buildCodeTableHelper(root, "", codes);
return codes;
}
private static void buildCodeTableHelper(Node node, String code, Map<Character, String> codes) {
if (node.isLeaf()) {
codes.put(node.symbol, code);
} else {
buildCodeTableHelper(node.left, code + "0", codes);
buildCodeTableHelper(node.right, code + "1", codes);
}
}
// 压缩数据
public static String compress(String input, Map<Character, String> codes) {
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
sb.append(codes.get(c));
}
return sb.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入待编码的个数
System.out.print("请输入待编码的个数:");
int n = scanner.nextInt();
// 输入符号和概率
Map<Character, Double> frequencies = new HashMap<>();
for (int i = 0; i < n; i++) {
System.out.print("请输入符号和概率,用空格分隔:");
char symbol = scanner.next().charAt(0);
double frequency = scanner.nextDouble();
frequencies.put(symbol, frequency);
}
// 生成哈夫曼树和编码表
Node root = buildHuffmanTree(frequencies);
Map<Character, String> codes = buildCodeTable(root);
// 输出编码表
System.out.println("编码表:");
for (char symbol : codes.keySet()) {
System.out.println(symbol + ": " + codes.get(symbol));
}
// 输入待压缩的数据
System.out.print("请输入待压缩的数据:");
String input = scanner.next();
// 压缩数据
String compressed = compress(input, codes);
// 输出压缩结果
System.out.println("压缩结果:");
System.out.println(compressed);
}
}
```
你可以根据自己的需要进行修改。希望能够帮到你!
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)