Advertisement
monyca98

huffman_code

May 24th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include<iostream>
  2. #include <fstream>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<functional>
  7. #include<string>
  8. using namespace std;
  9.  
  10. ifstream f("file.txt");
  11. struct MinHeapNode {
  12.  
  13.     char data;
  14.     unsigned freq;
  15.     MinHeapNode *left, *right;
  16.     MinHeapNode(char data, unsigned freq)
  17.  
  18.     {
  19.  
  20.         left = right = NULL;
  21.         this->data = data;
  22.         this->freq = freq;
  23.     }
  24. };
  25.  
  26.  
  27. struct compare {
  28.  
  29.     bool operator()(MinHeapNode* l, MinHeapNode* r)
  30.  
  31.     {
  32.         return (l->freq > r->freq);
  33.     }
  34. };
  35.  
  36. void printCodes(struct MinHeapNode* root, string str)
  37. {
  38.  
  39.     if (!root)
  40.         return;
  41.  
  42.     if (root->data != '$')
  43.         cout << root->data << ": " << str << "\n";
  44.  
  45.     printCodes(root->left, str + "0");
  46.     printCodes(root->right, str + "1");
  47. }
  48.  
  49.  
  50. void HuffmanCodes(char data[], int freq[], int size)
  51. {
  52.     struct MinHeapNode *left, *right, *top;
  53.  
  54.  
  55.     priority_queue<MinHeapNode*, vector<MinHeapNode*>, compare> minHeap;
  56.  
  57.     for (int i = 0; i < size; ++i)
  58.         minHeap.push(new MinHeapNode(data[i], freq[i]));
  59.     while (minHeap.size() != 1) {
  60.  
  61.    
  62.         left = minHeap.top();
  63.         minHeap.pop();
  64.  
  65.         right = minHeap.top();
  66.         minHeap.pop();
  67.  
  68.        
  69.         top = new MinHeapNode('$', left->freq + right->freq);
  70.  
  71.         top->left = left;
  72.         top->right = right;
  73.  
  74.         minHeap.push(top);
  75.     }
  76.  
  77.     printCodes(minHeap.top(), "");
  78. }
  79.  
  80.  
  81. int main()
  82. {
  83.     int v[200];
  84.     for (int i = 'a'; i<'z'; i++)
  85.         v[i] = 0;
  86.     int dim = 0;
  87.     char s;
  88.     while (f >> s)
  89.     {
  90.         dim++;
  91.         v[s]++;
  92.     }
  93.  
  94.     char arr[100];
  95.     int freq[100];
  96.     int con = 0;
  97.     for (char i = 'a'; i<'z'; i++)
  98.         if (v[i]>0)
  99.         {
  100.             arr[con] = i;
  101.  
  102.             freq[con] = v[i];
  103.             con++;
  104.         }
  105.     arr[con]='\0';
  106.     int size = con;
  107.     HuffmanCodes(arr, freq, size);
  108.  
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement