This commit is contained in:
Sayyed Nabeel Ahmad 2024-07-17 10:42:18 +09:00 committed by GitHub
commit 7c09a66a75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 175 additions and 0 deletions

BIN
Huffman Coding/Output.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

113
Huffman Coding/huffman.js Normal file
View File

@ -0,0 +1,113 @@
// node class is the basic structure
// of each node present in the Huffman - tree.
class HuffmanNode
{
constructor()
{
this.data = 0;
this.c = '';
this.left = this.right = null;
}
}
// recursive function to print the
// huffman-code through the tree traversal.
// Here s is the huffman - code generated.
function printCode(root,s)
{
// base case; if the left and right are null
// then its a leaf node and we print
// the code s generated by traversing the tree.
if (root.left == null
&& root.right == null
&& (root.c).toLowerCase() != (root.c).toUpperCase()) {
// c is the character in the node
document.write(root.c + ":" + s+"<br>");
return;
}
// if we go to left then add "0" to the code.
// if we go to the right add"1" to the code.
// recursive calls for left and
// right sub-tree of the generated tree.
printCode(root.left, s + "0");
printCode(root.right, s + "1");
}
// main function
// number of characters.
let n = 6;
let charArray = [ 'a', 'b', 'c', 'd', 'e', 'f' ];
let charfreq = [ 5, 9, 12, 13, 16, 45 ];
// creating a priority queue q.
// makes a min-priority queue(min-heap).
let q = [];
for (let i = 0; i < n; i++) {
// creating a Huffman node object
// and add it to the priority queue.
let hn = new HuffmanNode();
hn.c = charArray[i];
hn.data = charfreq[i];
hn.left = null;
hn.right = null;
// add functions adds
// the huffman node to the queue.
q.push(hn);
}
// create a root node
let root = null;
q.sort(function(a,b){return a.data-b.data;});
// Here we will extract the two minimum value
// from the heap each time until
// its size reduces to 1, extract until
// all the nodes are extracted.
while (q.length > 1) {
// first min extract.
let x = q[0];
q.shift();
// second min extract.
let y = q[0];
q.shift();
// new node f which is equal
let f = new HuffmanNode();
// to the sum of the frequency of the two nodes
// assigning values to the f node.
f.data = x.data + y.data;
f.c = '-';
// first extracted node as left child.
f.left = x;
// second extracted node as the right child.
f.right = y;
// marking the f node as the root node.
root = f;
// add this node to the priority-queue.
q.push(f);
q.sort(function(a,b){return a.data-b.data;});
}
// print the codes by traversing the tree
printCode(root, "");
// This code is contributed by avanitrachhadiya2155

62
Huffman Coding/readme.md Normal file
View File

@ -0,0 +1,62 @@
Huffman coding is a lossless data compression algorithm. The idea is to assign variable-length codes to input characters, lengths of the assigned codes are based on the frequencies of corresponding characters. The most frequent character gets the smallest code and the least frequent character gets the largest code.
The variable-length codes assigned to input characters are Prefix Codes, means the codes (bit sequences) are assigned in such a way that the code assigned to one character is not the prefix of code assigned to any other character. This is how Huffman Coding makes sure that there is no ambiguity when decoding the generated bitstream.
Let us understand prefix codes with a counter example. Let there be four characters a, b, c and d, and their corresponding variable length codes be 00, 01, 0 and 1. This coding leads to ambiguity because code assigned to c is the prefix of codes assigned to a and b. If the compressed bit stream is 0001, the de-compressed output may be “cccd” or “ccb” or “acd” or “ab”.
See this for applications of Huffman Coding.<br/>
There are mainly two major parts in Huffman Coding<br/>
Build a Huffman Tree from input characters.<br/>
Traverse the Huffman Tree and assign codes to characters.<br/>
Steps to build Huffman Tree:-<br/>
1- Input is an array of unique characters along with their frequency of occurrences and output is Huffman Tree.<br/>
2- Create a leaf node for each unique character and build a min heap of all leaf nodes (Min Heap is used as a priority queue. The value of frequency field is used to compare two nodes in min heap. Initially, the least frequent character is at root)
Extract two nodes with the minimum frequency from the min heap.<br/>
3-Create a new internal node with a frequency equal to the sum of the two nodes frequencies. Make the first extracted node as its left child and the other extracted node as its right child. Add this node to the min heap.<br/>
4-Repeat steps#2 and #3 until the heap contains only one node. The remaining node is the root node and the tree is complete.<br/>
For example:-<br/>
1- Suppose the string below is to be sent over a network.<br/>
![Screenshot 2022-09-22 at 11 18 10 AM](https://user-images.githubusercontent.com/94233521/191668309-6dad431e-b10a-4c33-b762-2db8cfd0f27e.png)
2- Calculate the frequency of each character in the string.<br/>
![Screenshot 2022-09-22 at 11 18 10 AM](https://user-images.githubusercontent.com/94233521/191668512-8ed929db-dd6e-4623-8c16-09dd3ff7343d.png)
3- Sort the characters in increasing order of the frequency. These are stored in a priority queue<br/>
![Screenshot 2022-09-22 at 11 18 21 AM](https://user-images.githubusercontent.com/94233521/191668603-d5a087c6-ceb7-4a27-9e80-88c602d0c879.png)
4- Make each unique character as a leaf node.<br/>
5- Create an empty node z. Assign the minimum frequency to the left child of z and assign the second minimum frequency to the right child of z. Set the value of the z as the sum of the above two minimum frequencies.<br/>
![Screenshot 2022-09-22 at 11 18 28 AM](https://user-images.githubusercontent.com/94233521/191668999-e0d9ef52-493f-4a16-b9b5-8e892bebaafe.png)
6- Remove these two minimum frequencies from Q and add the sum into the list of frequencies (* denote the internal nodes in the figure above).<br/>
7-Insert node z into the tree.<br/>
8-Repeat steps 3 to 5 for all the characters.<br/>
![Screenshot 2022-09-22 at 11 18 37 AM](https://user-images.githubusercontent.com/94233521/191669278-521d3132-71cc-4a12-ad38-2783ab5766e7.png)
![Screenshot 2022-09-22 at 11 18 45 AM](https://user-images.githubusercontent.com/94233521/191669386-3dda5baf-becb-488d-b587-3274c41cb301.png)
9- For each non-leaf node, assign 0 to the left edge and 1 to the right edge.<br/>
![Screenshot 2022-09-22 at 11 18 55 AM](https://user-images.githubusercontent.com/94233521/191669462-c66c15b4-43fa-4181-a0a5-e6474aa2c0de.png)
10-For sending the above string over a network, we have to send the tree as well as the above compressed-code. The total size is given by the table below.<br/>
![Screenshot 2022-09-22 at 11 19 07 AM](https://user-images.githubusercontent.com/94233521/191669540-c912f863-f372-4797-9e87-dabfee3cec6c.png)
Without encoding, the total size of the string was 120 bits. After encoding the size is reduced to 32 + 15 + 28 = 75.<br/>