请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。(哈夫曼树)...

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

输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述:
一行输出最短的编码后长度。
输入例子:
MT-TECH-TEAM
输出例子:
33
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String s = scanner.next();
            System.out.println(createHuffman(s));
        }
    }
    public static int createHuffman(String s) {
        char[] chars = s.toCharArray();
         //hash表存放每个字符和出现的次数(出现的次数就是权重)
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for(int i=0;i<chars.length;i++){
            if(map.containsKey(chars[i])){
                map.put(chars[i], map.get(chars[i]) + 1);
            }
            else{
                map.put(chars[i], 1);
            }
        }
        //优先队列(最小推),每次能得到weigh最小的node
        PriorityQueue<HuffmanNode> queue = new PriorityQueue<>(map.size(), new Comparator<HuffmanNode>() {
            @Override
            public int compare(HuffmanNode o1, HuffmanNode o2) {
                // TODO Auto-generated method stub
                return o1.weight - o2.weight;
            }
        });
        //构建哈夫曼树合并两个权重最小的节点,直到只剩下根节点root
        for(Entry<Character, Integer> entry : map.entrySet()){
            queue.offer(new HuffmanNode(entry.getValue(), entry.getKey()));
        }
        while(queue.size() > 1){
            //弹出两个权重最小的,合并为一个node
            HuffmanNode leftNode = queue.poll();
            HuffmanNode rightNode = queue.poll();
            HuffmanNode fatherNode = new HuffmanNode(leftNode.weight + rightNode.weight);
            fatherNode.left = leftNode;
            fatherNode.right = rightNode;
            queue.offer(fatherNode);
        }
        HuffmanNode root = queue.poll();
        return getLength(root, 0);

    }
    public static int getLength(HuffmanNode node, int depth) {
        if(node == null){ //仅计算ch有值的
            return 0;
        }
        return (node.ch == null ? 0:node.weight)*depth + getLength(node.left, depth+1) + getLength(node.right, depth+1);
    }
}
class HuffmanNode{
    int weight;//权重(字符出现次数)
    HuffmanNode left;
    HuffmanNode right;
    Character ch; //如果是初始字符,则ch为字符,如果是合并的,则为null
    public HuffmanNode(int weight) {
        super();
        this.weight = weight;
    }
    public HuffmanNode(int weight, char ch) {
        super();
        this.weight = weight;
        this.ch = ch;
    }
}

  



转载于:https://www.cnblogs.com/GumpYan/p/5861605.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串最短算法的目的是尽可能地减少字符串长度,通常通过在字符串中寻找重复的子串并将其压缩来实现。 常见的字符串最短算法包括哈夫曼编码和字典压缩算法。 哈夫曼编码是一种统计学编码方法,它可以有效地压缩字符串。哈夫曼编码的基本思想是,将出现频率最高的字符用最短二进制编码表示,而出现频率较低的字符用较长的二进制编码表示。这样可以最大限度地减少字符串长度。 字典压缩算法是一种把字符串中的重复子串压缩成一个短的字典编码的方法。这种算法通常使用一个字典来保存所有出现过的子串,并为每个子串分配一个唯一的编码。当遇到重复的子串时,可以使用该子串的编码来代替原始子串,从而达到压缩字符串的目的。 总的来说,字符串最短算法可以有效地减少字符串长度,并且在很多场景下都很有用,例如在数据压缩和数据传输中。但是,它们的时间复杂度 ### 回答2: 最短字符串算法分析,可以参考以下思路: 假设有一个字符串字典,存储了一系列的字符串。我们需要找到其中最短字符串。 一种简单的方法是遍历整个字符串字典,在遍历过程中记录当前最短字符串。具体过程如下: 1. 初始化一个变量min_str为一个较大值,表示当前最短字符串。比如可以将min_str设为一个很长的字符串或者Infinity。 2. 遍历字符串字典中的每个字符串,可以使用循环来实现。假设字符串字典存储在一个数组str_list中。 3. 在循环中,对于每个字符串str,比较其长度与min_str的长度。如果str的长度更小,则更新min_str为当前的str。 4. 循环结束后,min_str即为最短字符串。 该算法的时间复杂度为O(n),其中n为字符串字典中的字符串数量。因为我们需要遍历整个字符串字典一次来找到最短字符串。 不过需要注意的是,这个算法假设了字符串字典中的每个字符串都是有效的,且最短字符串只有一个。如果字符串字典中存在无效字符串,或者最短字符串不只一个,该算法可能会出现错误结果。 如果字符串字典中存在大量字符串,或者需要频繁查找最短字符串,可以考虑使用更高效的数据结构,例如二叉堆或者平衡二叉搜索树,来实现更优化的算法。 ### 回答3: 最短字符串算法分析如下: 问题描述:给定一个字符串数组,要求从中找出最短字符串。 解题思路: 1. 初始化一个变量min_length,用于记录最短字符串长度,初始值可以设为正无穷大。 2. 遍历字符串数组中的每一个字符串,设当前遍历到的字符串为s。 3. 判断当前字符串s的长度是否小于min_length,如果是,则更新min_length的值为s的长度。 4. 继续遍历下一个字符串。 5. 最后返回长度为min_length的字符串即可。 算法复杂度分析: - 时间复杂度:该算法需要遍历字符串数组中的每一个字符串,时间复杂度为O(n),其中n为字符串数组的长度。 - 空间复杂度:该算法只需要常数级别的额外空间,空间复杂度为O(1)。 代码示例(Python): ``` def find_shortest_string(strings): min_length = float('inf') shortest_string = "" for s in strings: if len(s) < min_length: # 判断当前字符串长度是否小于min_length min_length = len(s) # 更新min_length的值 shortest_string = s # 更新最短字符串 return shortest_string # 测试 strings = ["apple", "banana", "cat", "dog", "elephant"] shortest_string = find_shortest_string(strings) print("最短字符串是:", shortest_string) ``` 输出结果为:"最短字符串是: cat"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值