Question: 1-taking a text file you have to perform Huffman coding on that file and generate the code...after we have to decode that code and then
1-taking a text file you have to perform Huffman coding on that file and generate the code...after we have to decode that code and then display the text which is encoded and decoded using bitwise operators.
2- please complete the below Huffman coding with decoded and encode part with its main functions means the output should be both encoded and decoded text.
#include #include #include #include
using namespace std;
// Tree node for Huffman coding struct HuffmanNode { char data; int freq; HuffmanNode *left, *right;
HuffmanNode(char data, int freq) { this->data = data; this->freq = freq; left = right = NULL; } }; struct Compare { bool operator()(HuffmanNode* a, HuffmanNode* b) { return a->freq > b->freq; } }; void generateCodes(HuffmanNode* root, string code, unordered_map& codes) { if (root == NULL) return; if (root->data != '\0') { codes[root->data] = code; } generateCodes(root->left, code + '0', codes); generateCodes(root->right, code + '1', codes); } unordered_map buildHuffmanTree(string text) { unordered_map freqMap; for (char c : text) { freqMap[c]++; }
priority_queue, Compare> pq; for (auto& p : freqMap) { pq.push(new HuffmanNode(p.first, p.second)); }
while (pq.size() > 1) { HuffmanNode* left = pq.top(); pq.pop(); HuffmanNode* right = pq.top(); pq.pop(); HuffmanNode* parent = new HuffmanNode('\0', left->freq + right->freq); parent->left = left; parent->right = right; pq.push(parent); }
unordered_map codes; generateCodes(pq.top(), "", codes); return codes; }
// Encodes the text using the generated Huffman codes string huffmanEncode(string text, unordered_map& codes) { string encodedText = ""; for (char c : text) { encodedText += codes[c]; } return encodedText; }
// Decodes the Huffman-encoded text using the generated Huffman codes string huffmanDecode(string encodedText, unordered_map& codes) { string decodedText = ""; int i = 0; while (i < encodedText.size()) { HuffmanNode* node = codes.begin()->second[0] == '0' ? codes.begin()->second[1] == '0' ? codes.begin()->second[2] == '0' ? codes.begin()->second[3] == '0' ? codes.begin()->second[4] == '0' ? codes.begin()->second[5] == '0' ? codes.begin()->second[6] == '0' ? codes.begin()->second[7] == '0' ? codes.begin()->second[8] == '0' ? codes.begin()->second[9] == '0' ? codes.begin()->second[10] == '0' ? codes.begin()->second[11] == '0' ? codes.begin()->second[12] == '0' ? codes.begin()->second[13] == '0' ? codes.begin()->second[14] == '0' ? codes.begin()->second[15] == '0' ? node->left : node->right : codes.begin()->second[15] == '0' ? node->left : node->right : codes.begin()->second[14] == '0' ? node->left : node->right : codes.begin()->second[13] == '0' ? node->left : node->right : codes.begin()->second[12] == '0' ? node->left : node->right : codes.begin()->second[11] == '0' ? node->left : node->right : codes.begin()->second[10] == '0' ? node->left : node->right : codes.begin()->second[9] == '0' ? node->left : node->right : codes.begin()->second[8] == '0' ? node->left : node->right : codes.begin()->second[7] == '0' ? node->left : node->right : codes.begin()->second[6] == '0' ? node->left : node->right : codes.begin()->second[5] == '0' ? node->left : node->right : codes.begin()->second[4] == '0' ? node->left : node->right : codes.begin()->second[3] == '0' ? node->left : node->right : codes.begin()->second[2] == '0' ? node->left : node->right : node->right;
if (node->data != '\0') { decodedText += node->data; i++; } } return decodedText; }
int main() { string text = "hello world"; unordered_map codes = buildHuffmanTree(text); string encodedText = huffmanEncode(text, codes); cout << "Encoded text: " << encodedText << endl;
string decodedText = huffmanDecode(encodedText, codes); cout << "Decoded text: " << decodedText << endl; return 0; }