哈夫曼编码(笔记)

import java.util.*;

class Node {
    char data;
    int freq;
    Node left, right;

    public Node(char data, int freq) {
        this.data = data;
        this.freq = freq;
        this.left = null;
        this.right = null;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String input = sc.next();
        Map<Character, String> huffmanCodes = getHuffmanCodes(input);
        for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
            System.out.println("字符: " + entry.getKey() + ", 编码: " + entry.getValue());
        }
    }

    public static Map<Character, String> getHuffmanCodes(String input) {
        char[] C = input.toCharArray();
        Set<Character> set = new HashSet<>();
        for (char c : C) {
            set.add(c);
        }
        int n = set.size();
        PriorityQueue<Node> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(node -> node.freq));
        for (char c : set) {
            int freq = 0;
            for (char ch : C) {
                if (ch == c) {
                    freq++;
                }
            }
            priorityQueue.offer(new Node(c, freq));
        }
        for (int i = 0; i < n - 1; i++) {
            Node x = priorityQueue.poll();
            Node y = priorityQueue.poll();
            Node z = new Node('-', x.freq + y.freq);
            z.left = x;
            z.right = y;
            priorityQueue.offer(z);
        }

        Map<Character, String> huffmanCodes = new HashMap<>();
        generateHuffmanCodes(priorityQueue.peek(), "", huffmanCodes);
        return huffmanCodes;
    }

    public static void generateHuffmanCodes(Node node, String code, Map<Character, String> huffmanCodes) {
        if (node == null) {
            return;
        }
        if (node.data != '-') {
            huffmanCodes.put(node.data, code);
        }
        generateHuffmanCodes(node.left, code + "0", huffmanCodes);
        generateHuffmanCodes(node.right, code + "1", huffmanCodes);
    }
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值