Java를 사용하여 허프만 코딩 알고리즘을 구현하는 방법
Java에서 허프만 코딩 알고리즘을 구현하는 방법
허프만 코딩 알고리즘은 데이터 압축에 효과적인 방법으로, 문자 시간이 더 자주 발생하도록 짧은 인코딩을 사용하여 저장 공간과 전송을 줄입니다. 이 기사에서는 Java를 사용하여 허프만 코딩 알고리즘을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.
- 허프만 트리 구축
먼저, 허프만 트리를 구축해야 합니다. 허프만 트리는 각 리프 노드가 문자에 해당하고 트리의 리프가 아닌 각 노드에 두 개의 자식 노드가 있는 특수 이진 트리입니다. 허프만 트리를 구축하는 단계는 다음과 같습니다.
1.1 노드 클래스 생성
먼저, 허프만 트리의 노드를 나타내는 노드 클래스를 생성해야 합니다. 노드 클래스에는 문자, 빈도, 왼쪽 및 오른쪽 하위 노드라는 세 가지 속성이 포함되어 있습니다.
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 허프만 트리 구성
허프만 트리를 구성하는 단계는 다음과 같습니다.
- 노드 목록을 만들고 각 문자를 별도의 노드로 목록에 삽입합니다.
- 노드 목록을 빈도별로 작은 것부터 큰 것까지 정렬하세요.
- 노드 목록에서 빈도가 가장 작은 두 개의 노드를 꺼내고 새 노드를 상위 노드로 만든 다음 이 새 노드를 목록에 삽입합니다.
- 목록에 하나의 노드, 즉 루트 노드만 남을 때까지 위 단계를 반복합니다.
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(); } }
- 허프만 인코딩 생성
다음으로 허프만 트리를 기반으로 문자 인코딩을 생성해야 합니다. 코딩 규칙은 루트 노드부터 시작하여 왼쪽 하위 트리로 가면 코드가 0이고 오른쪽 하위 트리로 가면 코드가 1입니다. 각 문자에 대해 허프만 트리를 재귀적으로 탐색하여 인코딩을 생성할 수 있습니다.
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); } } }
- 허프만 코딩의 압축 및 풀기
허프만 코딩을 사용하면 데이터를 압축하고 풀 수 있습니다.
3.1 압축 데이터
압축할 데이터를 문자 배열로 변환하고 각 문자를 순회한 후 허프만 코딩을 사용하여 압축 인코딩된 문자열을 생성합니다.
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 압축 해제된 데이터
압축된 인코딩 문자열의 경우 허프만 트리에 따라 디코딩해야 합니다. 즉, 루트 노드부터 시작하여 인코딩된 문자열을 순회해야 합니다. If When. 1을 만나면 리프 노드를 찾을 때까지, 즉 원래 캐릭터를 찾을 때까지 오른쪽 하위 트리로 이동합니다.
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(); } }
위의 코드를 이용하여 허프만 코딩 알고리즘을 구현할 수 있습니다. 허프만 코딩을 사용하면 데이터를 어느 정도 압축하여 저장 공간과 전송 시간을 줄일 수 있습니다.
위 내용은 Java를 사용하여 허프만 코딩 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Spring Boot는 강력하고 확장 가능하며 생산 가능한 Java 응용 프로그램의 생성을 단순화하여 Java 개발에 혁명을 일으킨다. Spring Ecosystem에 내재 된 "구성에 대한 협약"접근 방식은 수동 설정, Allo를 최소화합니다.
