首页 > 编程语言 >ChatGPT 问答00021 java 对字符串进行高度压缩的算法

ChatGPT 问答00021 java 对字符串进行高度压缩的算法

时间:2023-08-23 21:24:20浏览次数:47  
标签:Node right java 00021 frequency new input ChatGPT left

Java中对字符串进行高度压缩的算法有很多种,下面我介绍两种常见的方法。

  1. Run-Length Encoding (RLE) 算法
    RLE算法是一种简单且高效的字符串压缩算法。它通过将连续重复的字符序列替换为一个字符和其重复次数的表示来实现压缩。

示例代码如下:

public static String compressString(String input) {
    StringBuilder compressed = new StringBuilder();
    int count = 1;
    
    for (int i = 0; i < input.length(); i++) {
        if (i + 1 < input.length() && input.charAt(i) == input.charAt(i + 1)) {
            count++;
        } else {
            compressed.append(input.charAt(i));
            compressed.append(count);
            count = 1;
        }
    }
    
    return compressed.toString();
}
  1. Huffman 编码算法
    Huffman编码是一种基于字符出现频率的无损压缩算法。它通过构建字符集的最优二叉树来实现压缩,出现频率高的字符使用较短的编码,出现频率低的字符使用较长的编码。

示例代码如下:

import java.util.HashMap;
import java.util.PriorityQueue;

class Node implements Comparable<Node> {
    char character;
    int frequency;
    Node left, right;

    public Node(char character, int frequency, Node left, Node right) {
        this.character = character;
        this.frequency = frequency;
        this.left = left;
        this.right = right;
    }

    public boolean isLeaf() {
        return left == null && right == null;
    }

    @Override
    public int compareTo(Node node) {
        return frequency - node.frequency;
    }
}

public class HuffmanCompression {
    public static String compressString(String input) {
        HashMap<Character, Integer> frequencyMap = new HashMap<>();
        
        // 统计字符出现的频率
        for (char c : input.toCharArray()) {
            frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
        }
        
        // 构建优先队列
        PriorityQueue<Node> queue = new PriorityQueue<>();
        for (char c : frequencyMap.keySet()) {
            queue.offer(new Node(c, frequencyMap.get(c), null, null));
        }
        
        // 构建Huffman树
        while (queue.size() > 1) {
            Node left = queue.poll();
            Node right = queue.poll();
            Node parent = new Node('\0', left.frequency + right.frequency, left, right);
            queue.offer(parent);
        }
        
        // 构建编码表
        HashMap<Character, String> encodingMap = new HashMap<>();
        buildEncodingMap(queue.peek(), "", encodingMap);
        
        // 压缩字符串
        StringBuilder compressed = new StringBuilder();
        for (char c : input.toCharArray()) {
            compressed.append(encodingMap.get(c));
        }
        
        return compressed.toString();
    }
    
    private static void buildEncodingMap(Node node, String code, HashMap<Character, String> encodingMap) {
        if (node.isLeaf()) {
            encodingMap.put(node.character, code);
        } else {
            buildEncodingMap(node.left, code + "0", encodingMap);
            buildEncodingMap(node.right, code + "1", encodingMap);
        }
    }
}

这些算法只是简单的示例,实际应用中需要根据具体情况进行调整和优化。另外,请注意对于较短的字符串,压缩可能导致更大的存储空间占用,因此在实际应用中需要综合考虑压缩和解压缩的开销以及数据规模等因素。

标签:Node,right,java,00021,frequency,new,input,ChatGPT,left
From: https://www.cnblogs.com/virtulreal/p/17652796.html

相关文章

  • Java设计思想
    KeepItSimpleandStupidKISS原则就是保持代码可读和可维护代码足够简单,也就意味着容易读懂,bug比较难隐藏。即便出现bug,修复也比较简单如何写出满足KISS原则的代码关于如何写出满足KISS原则的代码,前面已经讲了一些方法,这里总结一下。1)慎重使用过于复杂的技术来实现代码,如复......
  • Java编码技巧
    1.常量&变量1.1.直接赋值常量值,禁止声明新对象直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值。反例:Longi=newLong(1L);Strings=newString("abc");正例:Longi=1L;Strings="abc";1.2.当成员变量值无需改变时,尽量定义为静态常量在类的每个对象实例中,......
  • javaScript之内置对象1
    一:概述JavaScript内置对象表示Web浏览器内部支持的对象,它们提供了很多有用的功能,让使用者可以快速实现许多功能。二:说明及其举例说明数据类型:包括Number、String、Boolean、Object、Array等,这些对象提供了用于操作基本数据类型的方法。例如,使用String对象的substring()方法可以截取......
  • Java基础
    题1:什么是自动装箱?什么是自动拆箱?自动装箱是指将基本数据类型重新转化为对象。public class Test {   public static void main(String[] args) {   Integer num = 9; }  }  num = 9的值是属于基本数据类型,原则上不能直接赋值给对象Integer。但是在JDK1.5版......
  • org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan(Lorg/apache/tomcat/
    原因<dependency><groupId>org.apache.hive</groupId><artifactId>hive-jdbc</artifactId><version>3.1.3</version></dependency>解决<dependency>......
  • Java反射介绍
    反射的概述什么是反射Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflecti......
  • 深入探索Java中的并发编程:CAS机制的原理与应用
    在当今多核处理器的时代,有效地利用多线程并发成为了现代后端开发的关键。在Java中,CAS(CompareandSwap)机制作为一种乐观锁技术,被广泛用于实现高性能的并发操作。本文将深入分析CAS机制的原理,介绍其在Java中的应用,以及在多线程环境下如何优化并发性能。CAS机制的原理CAS是一种用于实......
  • java中创建线程的三种方法以及区别
    java中创建线程的三种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程下面让我们分别来看看这三种创建线程的......
  • Java基础
    一、注释单行注释//多行注释 /*我是多行注释*/文档注释Javadoc/***@Description:HelloWorld*@Author:SYL*/二、标识符和关键字    三、数据类型 浮点数是有限的离散的舍入误差大约接近但不等于的值      变量:可以变化的量每......
  • 软件测试 | Java中的关键字
    Java中也有许多关键字(也叫保留字),如public、static等,这些关键字不能当做标识符使用。表2-1列出了Java中的关键字,这些关键字并不需要去硬背,因为在程序开发中一旦使用了这些关键字做标识符时,编辑器会自动提示错误。对于以上的关键字,要特别注意的有如下3点:(1)虽然goto、const在Java中并没......