So implementieren Sie den Huffman-Codierungsalgorithmus mit Java
So implementieren Sie den Huffman-Codierungsalgorithmus in Java
Der Huffman-Codierungsalgorithmus ist eine effektive Methode zur Datenkomprimierung, die den Speicherplatz und die Übertragung reduziert, indem kürzere Codierungen für eine häufigere Zeichenzeit verwendet werden. In diesem Artikel wird die Verwendung von Java zur Implementierung des Huffman-Codierungsalgorithmus vorgestellt und spezifische Codebeispiele gegeben.
- Bau des Huffman-Baums
Zuerst müssen wir einen Huffman-Baum bauen. Ein Huffman-Baum ist ein spezieller Binärbaum, in dem jeder Blattknoten einem Zeichen entspricht und jeder Nicht-Blattknoten des Baums zwei untergeordnete Knoten hat. Die Schritte zum Erstellen eines Huffman-Baums sind wie folgt:
1.1 Erstellen Sie eine Knotenklasse
Zuerst müssen wir eine Knotenklasse erstellen, um die Knoten des Huffman-Baums darzustellen. Die Knotenklasse enthält drei Attribute: Zeichen, Häufigkeit sowie linke und rechte untergeordnete Knoten.
class Node { char data; int frequency; Node left; Node right; // 构造函数 public Node(char data, int frequency){ this.data = data; this.frequency = frequency; left = null; right = null; } }
1.2 Erstellen eines Huffman-Baums
Die Schritte zum Erstellen eines Huffman-Baums sind wie folgt:
- Erstellen Sie eine Liste von Knoten und fügen Sie jedes Zeichen als separaten Knoten in die Liste ein.
- Sortieren Sie die Knotenliste nach Häufigkeit von klein nach groß.
- Nehmen Sie die beiden Knoten mit der kleinsten Häufigkeit aus der Knotenliste, erstellen Sie einen neuen Knoten als übergeordneten Knoten und fügen Sie diesen neuen Knoten in die Liste ein.
- Wiederholen Sie die obigen Schritte, bis nur noch ein Knoten in der Liste übrig ist, der Wurzelknoten.
class HuffmanTree { public static Node buildHuffmanTree(HashMap<Character, Integer> frequencies) { PriorityQueue<Node> pq = new PriorityQueue<>(Comparator.comparingInt(node -> node.frequency)); // 将每个字符作为一个单独的节点插入到优先队列中 for (Map.Entry<Character, Integer> entry : frequencies.entrySet()) { pq.offer(new Node(entry.getKey(), entry.getValue())); } // 构建哈夫曼树 while (pq.size() > 1) { Node leftChild = pq.poll(); Node rightChild = pq.poll(); Node parent = new Node('', leftChild.frequency + rightChild.frequency); parent.left = leftChild; parent.right = rightChild; pq.offer(parent); } return pq.peek(); } }
- Generierung der Huffman-Kodierung
Als nächstes müssen wir die Zeichenkodierung basierend auf dem Huffman-Baum generieren. Die Codierungsregel lautet: Wenn Sie vom Wurzelknoten aus zum linken Teilbaum gehen, ist der Code 0, wenn Sie zum rechten Teilbaum gehen, ist der Code 1. Für jedes Zeichen können wir die Codierung generieren, indem wir den Huffman-Baum rekursiv durchlaufen.
class HuffmanEncoding { public static String getHuffmanCode(Node root, char target) { StringBuilder code = new StringBuilder(); generateHuffmanCode(root, target, code); return code.toString(); } private static void generateHuffmanCode(Node node, char target, StringBuilder code) { if (node == null) { return; } if (node.data == target) { return; } // 往左子树走 code.append('0'); generateHuffmanCode(node.left, target, code); if (code.charAt(code.length() - 1) != '1') { code.deleteCharAt(code.length() - 1); // 往右子树走 code.append('1'); generateHuffmanCode(node.right, target, code); } if (code.charAt(code.length() - 1) != '1') { code.deleteCharAt(code.length() - 1); } } }
- Komprimierung und Dekomprimierung der Huffman-Codierung
Mit der Huffman-Codierung können wir Daten komprimieren und dekomprimieren.
3.1 Komprimierte Daten
Konvertieren Sie die zu komprimierenden Daten in ein Zeichenarray, durchlaufen Sie jedes Zeichen und generieren Sie mithilfe der Huffman-Codierung eine komprimierte codierte Zeichenfolge.
class HuffmanCompression { public static String compressData(String data, HashMap<Character, String> huffmanCodes) { StringBuilder compressedData = new StringBuilder(); char[] characters = data.toCharArray(); for (char c : characters) { compressedData.append(huffmanCodes.get(c)); } return compressedData.toString(); } }
3.2 Dekomprimierte Daten
Für die komprimierte codierte Zeichenfolge müssen wir gemäß dem Huffman-Baum decodieren, dh die codierte Zeichenfolge ausgehend vom Wurzelknoten durchlaufen. Wenn 0 auftritt, gehen Sie zum linken Teilbaum Wenn Sie auf 1 stoßen, gehen Sie zum rechten Teilbaum, bis Sie den Blattknoten finden, dh Sie finden das ursprüngliche Zeichen.
class HuffmanDecompression { public static String decompressData(String compressedData, Node root) { StringBuilder decompressedData = new StringBuilder(); Node currentNode = root; for (char bit : compressedData.toCharArray()) { if (bit == '0') { currentNode = currentNode.left; } else if (bit == '1') { currentNode = currentNode.right; } if (currentNode.left == null && currentNode.right == null) { decompressedData.append(currentNode.data); currentNode = root; } } return decompressedData.toString(); } }
Durch die Verwendung des obigen Codes können wir den Huffman-Codierungsalgorithmus implementieren. Durch die Verwendung der Huffman-Codierung können Daten bis zu einem gewissen Grad komprimiert und Speicherplatz und Übertragungszeit reduziert werden.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Huffman-Codierungsalgorithmus mit Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo
