Question

You are given an array of N unsigned chars (symbols) where each symbol is represented by...

You are given an array of N unsigned chars (symbols) where each symbol is represented by 8-bits
Design a Huffman Coder in C++ that returns the length of the codeword for each of the possible 256 symbols and the total number of bits required to encode this data
Requirements:
After computing the frequency of occurrence of each symbol, you must implement a min-heap (priority queue) to implement the Huffman coder.

The function to fill in C++:
int HuffmanCoder(vector<unsigned char> &data, vector<unsigned char> &codewordLengths) {
// Fill this in
return 0;
} //end-HuffmanCoder

PseudoCode for this implementation:
C = count the frequency of each symbol
Create a Priority Queue (min-heap) Q;
For each symbol x in C do {
     x = new leaf node;
     x.left = x.right = NULL;
     x.freq = C[x];
     Q.insert(x);
}
while Q has more than 1 elements do {
      z = new internal tree node;
      z.left = x = Q.extractMin();
      z.right = y = Q.extractMin();
      z.freq = x.freq + y.freq;
      Q.insert(z);
}

0 0
Add a comment Improve this question Transcribed image text
Answer #1

// C++ Program for Huffman Coding
// using Priority Queue
#include <iostream>
#include <queue>
using namespace std;

// Maximum Height of Huffman Tree.
#define MAX_SIZE 100

class HuffmanTreeNode {
public:
   // Stores character
   char data;

   // Stores frequency of
   // the character
   int freq;

   // Left child of the
   // current node
   HuffmanTreeNode* left;

   // Right child of the
   // current node
   HuffmanTreeNode* right;

   // Initializing the
   // current node
   HuffmanTreeNode(char character,
                   int frequency)
   {
       data = character;
       freq = frequency;
       left = right = NULL;
   }
};

// Custom comparator class
class Compare {
public:
   bool operator()(HuffmanTreeNode* a,
                   HuffmanTreeNode* b)
   {
       // Defining priority on
       // the basis of frequency
       return a->freq > b->freq;
   }
};

// Function to generate Huffman
// Encoding Tree
HuffmanTreeNode* generateTree(priority_queue<HuffmanTreeNode*,
                           vector<HuffmanTreeNode*>,
                                           Compare> pq)
{

   // We keep on looping till
   // only one node remains in
   // the Priority Queue
   while (pq.size() != 1) {

       // Node which has least
       // frequency
       HuffmanTreeNode* left = pq.top();

       // Remove node from
       // Priority Queue
       pq.pop();

       // Node which has least
       // frequency
       HuffmanTreeNode* right = pq.top();

       // Remove node from
       // Priority Queue
       pq.pop();

       // A new node is formed
       // with frequency left->freq
       // + right->freq

       // We take data as '$'
       // because we are only
       // concerned with the
       // frequency
       HuffmanTreeNode* node = new HuffmanTreeNode('$',
                               left->freq + right->freq);
       node->left = left;
       node->right = right;

       // Push back node
       // created to the
       // Priority Queue
       pq.push(node);
   }

   return pq.top();
}

// Function to print the
// huffman code for each
// character.

// It uses arr to store the codes
void printCodes(HuffmanTreeNode* root,
               int arr[], int top)
{
   // Assign 0 to the left node
   // and recur
   if (root->left) {
       arr[top] = 0;
       printCodes(root->left,
               arr, top + 1);
   }

   // Assign 1 to the right
   // node and recur
   if (root->right) {
       arr[top] = 1;
       printCodes(root->right, arr, top + 1);
   }

   // If this is a leaf node,
   // then we print root->data

   // We also print the code
   // for this character from arr
   if (!root->left && !root->right) {
       cout << root->data << " ";
       for (int i = 0; i < top; i++) {
           cout << arr[i];
       }
       cout << endl;
   }
}

void HuffmanCodes(char data[],
               int freq[], int size)
{

   // Declaring priority queue
   // using custom comparator
   priority_queue<HuffmanTreeNode*,
               vector<HuffmanTreeNode*>,
               Compare>
       pq;

   // inserting into the priority
   // queue
   for (int i = 0; i < size; i++) {
       HuffmanTreeNode* newNode
           = new HuffmanTreeNode(data[i], freq[i]);
       pq.push(newNode);
   }

   // Generate Huffman Encoding
   // Tree and get the root node
   HuffmanTreeNode* root = generateTree(pq);

   // Print Huffman Codes
   int arr[MAX_SIZE], top = 0;
   printCodes(root, arr, top);
}

// main function
int main()
{
   char data[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
   int freq[] = { 5, 9, 12, 13, 16, 45 };
   int size = sizeof(data) / sizeof(data[0]);

   HuffmanCodes(data, freq, size);
   return 0;
}

Add a comment
Know the answer?
Add Answer to:
You are given an array of N unsigned chars (symbols) where each symbol is represented by...
Your Answer:

Post as a guest

Your Name:

What's your source?

Earn Coins

Coins can be redeemed for fabulous gifts.

Not the answer you're looking for? Ask your own homework help question. Our experts will answer your question WITHIN MINUTES for Free.
Similar Homework Help Questions
  • I've posted 3 classes after the instruction that were given at start You will implement and...

    I've posted 3 classes after the instruction that were given at start You will implement and test a PriorityQueue class, where the items of the priority queue are stored on a linked list. The material from Ch1 ~ 8 of the textbook can help you tremendously. You can get a lot of good information about implementing this assignment from chapter 8. There are couple notes about this assignment. 1. Using structure Node with a pointer point to Node structure to...

  • I am getting a seg fault with my huffman tree. I'm not sure if it's my...

    I am getting a seg fault with my huffman tree. I'm not sure if it's my deconstructors but also getting some memory leaks. Can some one help me find my seg fault? It's in c++, thanks! //#ifndef HUFFMAN_HPP //#define HUFFMAN_HPP #include<queue> #include<vector> #include<algorithm> #include<iostream> #include <string> #include <iostream> using namespace std; class Node { public:     // constructor with left and right NULL nodes     Node(char charTemp, int c) {       ch = charTemp;       count = c;       left...

  • C language huffman This exercise will familiarize you with linked lists, which you will need for...

    C language huffman This exercise will familiarize you with linked lists, which you will need for a subsequent programming Getting Started assignment Overview Requirements Getting Started Submit Start by getting the files. Type 264get hw13 and then cd hw13 from bash. Pre-tester You will get the following files: Q&A Updates 1. huffman.h: An empty header file, you have to define your own functions in this homework. 2. huffman.c: An empty c file, you have to define your own functions in...

  • Code to be written in C++: Initially, you will be given symbols printed in a preorder...

    Code to be written in C++: Initially, you will be given symbols printed in a preorder traversal of a boolean expression tree. The internal nodes of the tree will contain one of the following operators: & (and), | (or), ^ (exclusive-or), or ! (not). The nodes containing the first three operators will have two children, while the nodes containing the ! operator will contain only a left child. The leaves of the tree will contain an operand - either f...

  • Input a simple undirected weighted graph G with non-negative edge weights (represented by w), and a...

    Input a simple undirected weighted graph G with non-negative edge weights (represented by w), and a source node v of G. Output: TDB. D: a vector indexed by the vertices of G. Q: priority queue containing the vertices of G using D[] as key D[v]=0; for (all vertex ut-v) [D[u]-infinity:) while not Q. empty() 11 Q is not empty fu - Q.removein(); // retrieve a vertex of Q with min D value for (all vertex : adjacent to u such...

  • For this assignment, you will write a program to work with Huffman encoding. Huffman code is...

    For this assignment, you will write a program to work with Huffman encoding. Huffman code is an optimal prefix code, which means no code is the prefix of another code. Most of the code is included. You will need to extend the code to complete three additional methods. In particular, code to actually build the Huffman tree is provided. It uses a data file containing the frequency of occurrence of characters. You will write the following three methods in the...

  • You will construct a Huffman tree based on the given frequencies of 26 English alphabets in...

    You will construct a Huffman tree based on the given frequencies of 26 English alphabets in upper case plus the space character. An internal tree node class in HuffmanTree with necessary information is required. • You will not randomly switch left and right children when merger two trees. Instead, you will build a right-heavy tree according to the following strategies to select the right child. (1) The tree that is taller will be the right child, i.e., the height is...

ADVERTISEMENT
Free Homework Help App
Download From Google Play
Scan Your Homework
to Get Instant Free Answers
Need Online Homework Help?
Ask a Question
Get Answers For Free
Most questions answered within 3 hours.
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT