java实现哈夫曼编码

下面是一个简单的Java实现哈夫曼编码的例子。这个例子中,我们假设输入是一个字符串,并且我们使用哈夫曼树对每个字符的出现频率进行编码。

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
 
public class HuffmanCoding {
 
    static class Node implements Comparable<Node> {
        char character;
        int frequency;
        Node left, right;
 
        Node(char character, int frequency) {
            this.character = character;
            this.frequency = frequency;
        }
 
        @Override
        public int compareTo(Node other) {
            return this.frequency - other.frequency;
        }
    }
 
    public static void huffmanCoding(String input) {
        // 统计每个字符的出现频率
        HashMap<Character, Integer> frequencyMap = new HashMap<>();
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
        }
 
        // 创建哈夫曼树的节点
        Queue<Node> nodes = new PriorityQueue<>();
        for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
            nodes.add(new Node(entry.getKey(), entry.getValue()));
        }
 
        // 构建哈夫曼树
        while (nodes.size() > 1) {
            Node left = nodes.poll();
            Node right = nodes.poll();
            Node parent = new Node('\0', left.frequency + right.frequency);
            parent.left = left;
            parent.right = right;
            nodes.add(parent);
        }
 
        // 从哈夫曼树构建编码
        HashMap<Character, String> huffmanCodes = new HashMap<>();
        buildCodes(nodes.poll(), "", huffmanCodes);
 
        // 输出每个字符的哈夫曼编码
        for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + huffmanCodes.get(entry.getKey()));
        }
    }
 
    private static void buildCodes(Node node, String code, HashMap<Character, String> huffmanCodes) {
        if (node == null) return;
        if (node.character != '\0') {
            huffmanCodes.put(node.character, code);
        } else {
            buildCodes(node.left, code + "0", huffmanCodes);
            buildCodes(node.right, code + "1", huffmanCodes);
        }
    }
 
    public static void main(String[] args) {
        String input = "this is an example for huffman coding";
        huffmanCoding(input);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值