哈夫曼编码

2020-04-30 16:14:21

问题描述:

请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。

输入

MT-TECH-TEAM

输出

33

问题求解:

本质就是按照频率建哈夫曼树,需要注意的是最后的深度其实就是合并的次数,没合并一次则深度加一。

    private int encode(String s) {
        char[] chs = s.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        for (char c : chs) map.put(c, map.getOrDefault(c, 0) + 1);
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for (char c : map.keySet()) pq.add(map.get(c));
        int res = 0;
        while (pq.size() > 1) {
            int q1 = pq.poll();
            int q2 = pq.poll();
            int curr = q1 + q2;
            pq.add(curr);
            res += curr;
        }
        return res;
    }

  

posted @ 2020-04-30 16:18  hyserendipity  阅读(193)  评论(0编辑  收藏  举报