แแฃแ แกแแก แแแฌแงแแแแแแ
Huffman แแแแแ แแแ แแ แแก แแแแแชแแแแ แจแแแฃแแจแแแก แแแแแ แแแแ, แ แแแแแแช แแงแแแแแแแก แคแแแแแก แจแแแฃแแจแแแก แซแแ แแแแ แแแแแก. แแ แกแขแแขแแแจแ แแแกแแฃแแ แแแ แคแแฅแกแแ แแแฃแแ แแ แชแแแแแ แกแแแ แซแแก แแแแแ แแแแแ, แชแแแกแแฎแแ แแแแแแแ แแแแ แแแแแแแ, แแ แแคแแฅแกแแก แฌแแกแแแแ แแ แฐแแคแแแแแก แฎแแก แแแแแแแ.
แฉแแแ แแแชแแ, แ แแ แแแแแแฃแแ แกแแแแแแ แแแแฎแแแ 0 แแ 1-แแแแก แแแแแแแแแแ แแแแ แแ แแฆแแแก 8 แแแขแก. แแแแก แแฌแแแแแ แคแแฅแกแแ แแแฃแแ แกแแแ แซแแก แแแแแ แแแ, แ แแแแแ แแแแแแฃแแ แกแแแแแแ แแงแแแแแก แแแขแแแแก แแแแแ แ แแแแแแแแแก แจแแกแแแแฎแแ.
แแแฅแแแ, แแแแแชแแก แขแแฅแกแขแ. แ แแแแ แจแแแแแชแแ แแ แแ แแ แกแแแแแแแก แจแแกแแแแฎแแ แกแแญแแ แ แกแแแ แชแแก แ แแแแแแแแ?
แแแแแแ แ แแแแ แแ แแก แชแแแแแ แกแแแ แซแแก แแแแแ แแแ. แฉแแแ แจแแแแแซแแแ แแแแแแแงแแแแ แแก แคแแฅแขแ, แ แแ แขแแฅแกแขแจแ แแแแแแ แแ แกแแแแแแ แฃแคแ แ แฎแจแแ แแ แแแฎแแแแแ, แแแแ แ แกแฎแแแแ (
แ แแแแ , แแแขแแแแก แแแแแแแแแแ แแแแก แชแแแแแ, แชแแแกแแฎแแ แแแจแแคแแ แ?
แแแแแฎแแแแ แฎแแแ "แแแแแแแ". แแแก แแฅแแก 8 แกแแแแแแ แแ แคแแฅแกแแ แแแฃแแ แกแแแ แซแแก แแแแแ แแแแกแแก แแแก แจแแกแแแแฎแแ แแแกแญแแ แแแแ 64 แแแขแ. แแแแแแแแแกแฌแแแแ, แ แแ แกแแแแแแแก แกแแฎแจแแ แ "แ", "แ", "แ" ะธ "แ" แฃแแ แแก 4, 2, 1, 1 แจแแกแแแแแแกแแ. แจแแแแชแแแแ แฌแแ แแแแแแแแแแ "แแแแแแแ" แแแแแแแ แแแขแ, แแ แคแแฅแขแแก แแแแแงแแแแแแ "to" แฎแแแแ แฃแคแ แ แฎแจแแ แแ แแแแ แ "แ"แฎแแแ "แ" แฎแแแแ แฃแคแ แ แฎแจแแ แแ แแแแ แ "c" ะธ "แ". แแแแแฌแงแแ แแแแแ แแแแ "to" แแ แแ แแแขแแ 0-แแก แขแแแ, "แ" แฉแแแ แแแแแแแญแแแ แแ แแแขแแแ แแแแก 11, แฎแแแ แกแแแ แแแขแแก แแแแแงแแแแแแ 100 แแ 011 แฉแแแ แแแแจแแคแ แแแ "c" ะธ "แ".
แจแแแแแแ, แฉแแแ แแแแแฆแแแ:
a
0
b
11
c
100
d
011
แแกแ แ แแ แฎแแแ "แแแแแแแ" แฉแแแ แแแแจแแคแ แแแ แ แแแแ แช 00110100011011 (0|0|11|0|100|011|0|11)แแแแแ แแแงแแแแแแ แแแแแแแก แแแแแงแแแแแแ. แแฃแแชแ, แแแแแแ แ แแ แแแแแแ แแแแแแแ แแแแจแ แแฅแแแแ. แ แแชแ แแชแแแแแแ แกแขแ แแฅแแแแก แแแจแแคแแ แแก 00110100011011, แแแฆแแแ แแ แแแ แแแแ แจแแแแแก, แ แแแแแ แแก แจแแแซแแแแ แฌแแ แแแแแแแแแ แแงแแก แ แแแแ แช:
0|011|0|100|011|0|11 adacdab
0|0|11|0|100|0|11|011 aabacabd
0|011|0|100|0|11|0|11 adacabab
...
แ.แจ.
แแ แแแฃแ แแแแแแแแแก แแแแแแแ แแกแแชแแแแแแแ, แฉแแแ แฃแแแ แแแแ แฌแแฃแแแแ, แ แแ แฉแแแแ แแแแแ แแแ แแแแแงแแคแแแแแก แแกแแ แแแแชแแคแชแแแก, แ แแแแ แแชแแ แแ แแคแแฅแกแแก แฌแแกแ, แ แแช แแแแแก แแฎแ แแ แแฃแแแกแฎแแแแก, แ แแ แแแแแแแก แแแจแแคแแ แ แจแแกแแซแแแแแแแ แแฎแแแแ แแ แแ แฃแแแแแแฃแ แ แแแแ. แแ แแคแแฅแกแแก แฌแแกแ แฃแแ แฃแแแแแงแแคแก, แ แแ แแ แชแแ แแ แแแแ แแ แแ แแก แกแฎแแ แแ แแคแแฅแกแ. แแแแแ, แฉแแแ แแแฃแแแกแฎแแแแ แแแขแแแก, แ แแแแแแแช แแแแแแงแแแแแ แแแแแ แแขแฃแแ แกแแแแแแแก แฌแแ แแแกแแฉแแแแ. แแแแแ แแแงแแแแแ แแแแแแแแจแ 0 แแ แแก แแ แแคแแฅแกแ 011, แ แแแแแแช แแ แฆแแแแก แแ แแคแแฅแกแแก แฌแแกแก. แแกแ แ แแ, แแฃ แฉแแแแ แแแแแแ แแแแแงแแคแแแแแก แแ แแคแแฅแกแแก แฌแแกแก, แแแจแแ แฉแแแ แจแแแแแซแแแ แชแแแกแแฎแแ แแแจแแคแแ แ (แแ แแแ แแฅแแ).
แแแแแ แแแแแแฎแแแแ แแแแแ แแแชแแแฃแ แแแแแแแแก. แแแฏแแ แแ แฉแแแ แแแแแแงแแคแ แกแแแแแแแแแก "แ", "แ", "แ" ะธ "แ" แแแแแแ, แ แแแแแแแช แแแแแงแแคแแแแแแ แแ แแคแแฅแกแแก แฌแแกแก.
a
0
b
10
c
110
d
111
แแ แแแแแ แแแแ, แกแขแ แแฅแแแ "แแแแแแแ" แแแจแแคแ แฃแแ แแฅแแแแ แ แแแแ แช 00100100011010 (0|0|10|0|100|011|0|10). แแแแ แแ 00100100011010 แฉแแแ แฃแแแ แจแแแซแแแแ แชแแแกแแฎแแ แแแจแแคแแ แแก แแ แฉแแแแก แแแแแแแแ แแแ แกแขแ แแฅแแแก แแแแ แฃแแแแแก "แแแแแแแ".
แฐแแคแแแแแก แแแแแ แแแ
แแฎแแ, แ แแแแกแแช แฉแแแ แแแแแแฎแแแแ แชแแแแแ แกแแแ แซแแก แแแแแ แแแ แแ แแ แแคแแฅแกแแก แฌแแกแ, แแแแแ แแแกแแฃแแ แแ แฐแแคแแแแแก แแแจแแคแแ แแแ.
แแแแแแ แแคแฃแซแแแแ แแแแแ แฃแแ แฎแแแแแก แจแแฅแแแแก. แแแกแจแ แแแแแซแ แจแแแซแแแแ แแงแแก แกแแแแแแ แแ แจแแแ. แแแแแแแแ แแแแแ, แงแแแแ แแแแแซแ แแแแแฎแแแแแ แคแแแแแแแ (แขแแ แแแแแแแแ), แ แแแแแแแช แฌแแ แแแแแแแแก แแแแแ แกแแแแแแแก แแ แแแก แฌแแแแก (แแแฃ แแแฉแแแแก แกแแฎแจแแ แแก). แจแแแ แแแแแซแแแ แจแแแชแแแก แกแแแแแแแก แฌแแแแก แแ แแฎแแแ แแ แจแแแแแแแแแ แแแแแซแก. แกแแแ แแ แจแแแแแฎแแแแแ, แชแแขแ ยซ0ยป แฌแแ แแแแแแแแก แแแ แชแฎแแแ แจแขแแก แจแแแแแ แแ ยซ1ยป - แแแ แฏแแแแ. แกแ แฃแ แฎแแจแ N แคแแแแแแ แแ N-1 แจแแแ แแแแแซแแแ. แ แแแแแแแแแ แแแฃแแแ แฐแแคแแแแแก แฎแแก แแแแแแกแแก แแแแแฃแงแแแแแแแ แกแแแแแแแแแแก แแแฃแฅแแแแ แแแขแแแแแฃแ แ แกแแแ แซแแก แแแแแแแก แแแกแแฆแแแแ.
แฉแแแ แแแแแแแงแแแแแ แแ แแแ แแขแแขแฃแ แ แแแก แฐแแคแแแแแก แฎแแก แแกแแจแแแแแแแ, แกแแแแช แงแแแแแแ แแแแแแ แกแแฎแจแแ แแก แแฅแแแ แแแแแซแก แแแแแแญแแแ แฃแแแฆแแแกแ แแ แแแ แแขแแขแ. แแจแแแแแแแแแก แแขแแแแแ แแฆแฌแแ แแแแ แฅแแแแแ:
- แจแแฅแแแแแ แคแแแแแก แแแแแซแ แแแแแแฃแแ แกแแแแแแแกแแแแก แแ แแแแแแขแแ แแกแแแ แแ แแแ แแขแแขแฃแ แ แแแจแ.
- แกแแแแ แ แแแจแ แแ แแแ แแแขแ แคแฃแ แชแแแแ, แแแแแแแแ แจแแแแแแ:
- แแแแแฆแแ แแ แ แแแแแซแ แฃแแแฆแแแกแ แแ แแแ แแขแแขแแก (แงแแแแแแ แแแแแแ แกแแฎแจแแ แแก) แ แแแแแแ;
- แจแแฅแแแแแ แแฎแแแ แจแแแ แแแแแซแ, แกแแแแช แแก แแ แ แแแแแซแ แแฅแแแแ แแแแจแแแแ แแ แแแฉแแแแก แกแแฎแจแแ แ แขแแแ แแฅแแแแ แแ แแ แ แแแแแซแแก แกแแฎแจแแ แแแแแก แฏแแแแก.
- แแแแแแขแแ แแฎแแแ แแแแแซแ แแ แแแ แแขแแขแฃแ แ แแแจแ.
- แแ แแแแแ แแ แแแ แฉแแแแแ แแแแแซแ แแฅแแแแ แคแแกแแ แแ แแก แแแแกแ แฃแแแแก แฎแแก แแจแแแแแแแแแก.
แฌแแ แแแแแแแแแ, แ แแ แแแแฅแแก แขแแฅแกแขแ, แ แแแแแแช แแฎแแแแ แกแแแแแแแแแแกแแแ แจแแแแแแ "แ แ แ แ" ะธ "แแ"แแ แแแแ แจแแแแฎแแแแแก แกแแฎแจแแ แแ 15, 7, 6, 6 แแ 5, แจแแกแแแแแแกแแ. แฅแแแแแ แแแชแแแฃแแแ แแแฃแกแขแ แแชแแแแ, แ แแแแแแแช แแกแแฎแแแก แแแแแ แแแแแก แแแแแฏแแแก.
แแแแแแ แคแแกแแแแแ แแแแแกแแแแ แแแแ แแแแแซแแแแ แจแแแแแฎแแแก แแแขแแแแแฃแ แแ แแคแแฅแกแแก แแแแก (แแกแแแ แชแแแแแแแ แ แแแแ แช แฐแฃแคแแแแแก แแแแ), แ แแแแแแช แจแแแกแแแแแแแ แแ แแแแ แแแแแซแแแ แแกแแชแแ แแแฃแ แกแแแแแแแก.
แฐแแคแแแแแก แฎแ
แฅแแแแแ แแแฎแแแ แฐแแคแแแแแก แจแแแฃแแจแแแก แแแแแ แแแแแก แแแแแ แแแแก C++-แกแ แแ Java-แจแ:
#include <iostream>
#include <string>
#include <queue>
#include <unordered_map>
using namespace std;
// A Tree node
struct Node
{
char ch;
int freq;
Node *left, *right;
};
// Function to allocate a new tree node
Node* getNode(char ch, int freq, Node* left, Node* right)
{
Node* node = new Node();
node->ch = ch;
node->freq = freq;
node->left = left;
node->right = right;
return node;
}
// Comparison object to be used to order the heap
struct comp
{
bool operator()(Node* l, Node* r)
{
// highest priority item has lowest frequency
return l->freq > r->freq;
}
};
// traverse the Huffman Tree and store Huffman Codes
// in a map.
void encode(Node* root, string str,
unordered_map<char, string> &huffmanCode)
{
if (root == nullptr)
return;
// found a leaf node
if (!root->left && !root->right) {
huffmanCode[root->ch] = str;
}
encode(root->left, str + "0", huffmanCode);
encode(root->right, str + "1", huffmanCode);
}
// traverse the Huffman Tree and decode the encoded string
void decode(Node* root, int &index, string str)
{
if (root == nullptr) {
return;
}
// found a leaf node
if (!root->left && !root->right)
{
cout << root->ch;
return;
}
index++;
if (str[index] =='0')
decode(root->left, index, str);
else
decode(root->right, index, str);
}
// Builds Huffman Tree and decode given input text
void buildHuffmanTree(string text)
{
// count frequency of appearance of each character
// and store it in a map
unordered_map<char, int> freq;
for (char ch: text) {
freq[ch]++;
}
// Create a priority queue to store live nodes of
// Huffman tree;
priority_queue<Node*, vector<Node*>, comp> pq;
// Create a leaf node for each character and add it
// to the priority queue.
for (auto pair: freq) {
pq.push(getNode(pair.first, pair.second, nullptr, nullptr));
}
// do till there is more than one node in the queue
while (pq.size() != 1)
{
// Remove the two nodes of highest priority
// (lowest frequency) from the queue
Node *left = pq.top(); pq.pop();
Node *right = pq.top(); pq.pop();
// Create a new internal node with these two nodes
// as children and with frequency equal to the sum
// of the two nodes' frequencies. Add the new node
// to the priority queue.
int sum = left->freq + right->freq;
pq.push(getNode('', sum, left, right));
}
// root stores pointer to root of Huffman Tree
Node* root = pq.top();
// traverse the Huffman Tree and store Huffman Codes
// in a map. Also prints them
unordered_map<char, string> huffmanCode;
encode(root, "", huffmanCode);
cout << "Huffman Codes are :n" << 'n';
for (auto pair: huffmanCode) {
cout << pair.first << " " << pair.second << 'n';
}
cout << "nOriginal string was :n" << text << 'n';
// print encoded string
string str = "";
for (char ch: text) {
str += huffmanCode[ch];
}
cout << "nEncoded string is :n" << str << 'n';
// traverse the Huffman Tree again and this time
// decode the encoded string
int index = -1;
cout << "nDecoded string is: n";
while (index < (int)str.size() - 2) {
decode(root, index, str);
}
}
// Huffman coding algorithm
int main()
{
string text = "Huffman coding is a data compression algorithm.";
buildHuffmanTree(text);
return 0;
}
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
// A Tree node
class Node
{
char ch;
int freq;
Node left = null, right = null;
Node(char ch, int freq)
{
this.ch = ch;
this.freq = freq;
}
public Node(char ch, int freq, Node left, Node right) {
this.ch = ch;
this.freq = freq;
this.left = left;
this.right = right;
}
};
class Huffman
{
// traverse the Huffman Tree and store Huffman Codes
// in a map.
public static void encode(Node root, String str,
Map<Character, String> huffmanCode)
{
if (root == null)
return;
// found a leaf node
if (root.left == null && root.right == null) {
huffmanCode.put(root.ch, str);
}
encode(root.left, str + "0", huffmanCode);
encode(root.right, str + "1", huffmanCode);
}
// traverse the Huffman Tree and decode the encoded string
public static int decode(Node root, int index, StringBuilder sb)
{
if (root == null)
return index;
// found a leaf node
if (root.left == null && root.right == null)
{
System.out.print(root.ch);
return index;
}
index++;
if (sb.charAt(index) == '0')
index = decode(root.left, index, sb);
else
index = decode(root.right, index, sb);
return index;
}
// Builds Huffman Tree and huffmanCode and decode given input text
public static void buildHuffmanTree(String text)
{
// count frequency of appearance of each character
// and store it in a map
Map<Character, Integer> freq = new HashMap<>();
for (int i = 0 ; i < text.length(); i++) {
if (!freq.containsKey(text.charAt(i))) {
freq.put(text.charAt(i), 0);
}
freq.put(text.charAt(i), freq.get(text.charAt(i)) + 1);
}
// Create a priority queue to store live nodes of Huffman tree
// Notice that highest priority item has lowest frequency
PriorityQueue<Node> pq = new PriorityQueue<>(
(l, r) -> l.freq - r.freq);
// Create a leaf node for each character and add it
// to the priority queue.
for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
pq.add(new Node(entry.getKey(), entry.getValue()));
}
// do till there is more than one node in the queue
while (pq.size() != 1)
{
// Remove the two nodes of highest priority
// (lowest frequency) from the queue
Node left = pq.poll();
Node right = pq.poll();
// Create a new internal node with these two nodes as children
// and with frequency equal to the sum of the two nodes
// frequencies. Add the new node to the priority queue.
int sum = left.freq + right.freq;
pq.add(new Node('', sum, left, right));
}
// root stores pointer to root of Huffman Tree
Node root = pq.peek();
// traverse the Huffman tree and store the Huffman codes in a map
Map<Character, String> huffmanCode = new HashMap<>();
encode(root, "", huffmanCode);
// print the Huffman codes
System.out.println("Huffman Codes are :n");
for (Map.Entry<Character, String> entry : huffmanCode.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
System.out.println("nOriginal string was :n" + text);
// print encoded string
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i < text.length(); i++) {
sb.append(huffmanCode.get(text.charAt(i)));
}
System.out.println("nEncoded string is :n" + sb);
// traverse the Huffman Tree again and this time
// decode the encoded string
int index = -1;
System.out.println("nDecoded string is: n");
while (index < sb.length() - 2) {
index = decode(root, index, sb);
}
}
public static void main(String[] args)
{
String text = "Huffman coding is a data compression algorithm.";
buildHuffmanTree(text);
}
}
แจแแแแจแแแ: แจแแงแแแแแก แกแขแ แแฅแแแแก แแแแ แแแแแงแแแแแฃแแ แแแฎแกแแแ แแแ แแ แแก 47 * 8 = 376 แแแขแ, แฎแแแ แแแแแ แแแฃแแ แกแขแ แแฅแแแ แแ แแก แแฎแแแแ 194 แแแขแ, แ.แ. แแแแแชแแแแแ แจแแแฃแแจแฃแแแ แแแแฎแแแแแแ 48%-แแ. แแแแแ แแแชแแแฃแ C++ แแ แแแ แแแแจแ, แฉแแแ แแแงแแแแแ แกแขแ แแฅแแแแแแก แแแแกแก แแแจแแคแ แฃแแ แกแขแ แแฅแแแแก แจแแกแแแแฎแแ, แ แแแ แแ แแแ แแแ แแแแแฎแแแแแแก.
แแแแก แแแแ, แ แแ แแคแแฅแขแฃแ แ แแ แแแ แแขแแขแฃแแ แ แแแแก แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแแ แกแแญแแ แแแแแ แแแแ แฉแแกแแแก O(log(N)) แแ แ, แแแแ แแ แกแ แฃแ แแ แแแแ แฎแแจแ N แคแแแแแแ แแแงแแคแแแ 2N-1 แแแแแซแแแ แแ แฐแแคแแแแแก แฎแ แแ แแก แกแ แฃแแ แแแแแ แฃแแ แฎแ, แจแแแแแ แแแแแ แแแแ แแฃแจแแแแก O(Nlog(N)) แแ แ, แกแแ N - แแแ แกแแแแแแแ.
แฌแงแแ แแแแ:
แฌแงแแ แ: www.habr.com