Advertisement
akela43

huffman-new

May 24th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <list>
  5. #include <algorithm>
  6. #include <set>
  7.  
  8. using namespace std;
  9. typedef std::pair <char, unsigned> Element;
  10.  
  11. class Node {
  12. public:
  13.     char c;
  14.     size_t freq;
  15.     Node *left;
  16.     Node *right;
  17.     Node(){}
  18.     Node(char c_, size_t freq_) :c(c_), freq(freq_), left(nullptr), right(nullptr) {}
  19.  
  20. };
  21. struct Comparator {
  22.  
  23.     bool operator()( const Node *left, const Node *right ) const {
  24.         return left->freq < right->freq;
  25.     }
  26. };
  27. class  Huffman
  28. {
  29. public:
  30.  
  31.     std::map <char, unsigned> mapFreq;
  32.     std::list <Node*> lstFreq;
  33.     std::map <char, std::vector<bool> > mapHuffman;
  34.     Node* root;
  35.  
  36.      Huffman(const std::string inputStr)  {
  37.  
  38.          for (auto some : inputStr) {
  39.              mapFreq[some]++;
  40.          }
  41.          root = new Node();
  42.      }
  43.  
  44.      unsigned getLetterNumber() const {
  45.          return mapFreq.size();
  46.      }
  47.  
  48.      void createVectorMap(Node* node, std::vector <bool> &sHuffman) {
  49.  
  50.          if ((node->left == nullptr) && (node->right == nullptr)) {
  51.              mapHuffman[node->c] = sHuffman;
  52.           }
  53.          else
  54.          {
  55.              if (node->left != nullptr)  {
  56.                  std::vector <bool> sHuffmanL=sHuffman;
  57.                  sHuffmanL.push_back(true);
  58.                  createVectorMap(node->left, sHuffmanL);
  59.              }
  60.              if (node->right != nullptr) {
  61.                  std::vector <bool> sHuffmanR=sHuffman;
  62.                  sHuffmanR.push_back(false);
  63.                  createVectorMap(node->right, sHuffmanR);
  64.              }
  65.  
  66.          }
  67.      }
  68.  
  69.      void solve() {
  70.          for (auto const& some : mapFreq) {
  71.           //  Node* node = new Node(some.first, some.second);
  72.             lstFreq.push_back(new Node({some.first, some.second}));
  73.          }
  74.         lstFreq.sort(Comparator());
  75.         for (auto const some : lstFreq) {
  76.          //  Node* node = new Node(some.first, some.second);
  77.            std::cout << some->c << some->freq << ", ";
  78.         }
  79.  
  80.         // создаем дерево
  81.          while (lstFreq.size() >1) {
  82.             lstFreq.sort(Comparator());
  83.  
  84.             std::cout << lstFreq.size();
  85.             Node *leftNode = lstFreq.front();
  86.  
  87.             lstFreq.pop_front();
  88.  
  89.             Node *rightNode = lstFreq.front();
  90.  
  91.             lstFreq.pop_front();
  92.  
  93.             Node *newNode  = new Node();
  94.             newNode->freq = leftNode->freq + rightNode->freq;
  95.             newNode->left = leftNode;
  96.             newNode->right = rightNode;
  97.  
  98.             lstFreq.push_front(newNode);
  99.  
  100.          }
  101.  
  102.          root = lstFreq.front();
  103.          root->left = lstFreq.front()->left;
  104.          root->right = lstFreq.front()->right;
  105.          lstFreq.pop_front();
  106.  
  107.          std::vector <bool> v1;
  108.          //v1.push_back(false);
  109.          createVectorMap(root, v1);
  110.  
  111.      }
  112.  
  113.  
  114.  
  115.      void print(Node* node) {
  116.  
  117.          if ((node->left == nullptr) && (node->right == nullptr)) {
  118.               std::cout << "("<< node->c <<")"<< " : " <<node->freq << endl;
  119.          }
  120.          else
  121.          {
  122.              if (node->left != nullptr)  {
  123.                  std::cout << "l";
  124.                  print(node->left);
  125.              }
  126.              if (node->right != nullptr) {
  127.                  std::cout << "r";
  128.                  print(node->right);
  129.              }
  130.  
  131.          }
  132.  
  133.         }
  134.  
  135.      void print() {
  136.          print(root);
  137.      }
  138.  
  139.      void printHuffmanTable() {
  140.          for (auto some : mapHuffman ){
  141.              std::cout << some.first << ": ";
  142.              for ( auto somebit : some.second ) {
  143.                 std::cout << (somebit) ?  "1" : "0";
  144.              }
  145.              std::cout << endl;
  146.          }
  147.      }
  148. };
  149.  
  150. int main()
  151. {
  152.     std::string inputStr;
  153.     std::getline (std::cin, inputStr);
  154.     Huffman huffman(inputStr);
  155.     huffman.solve();
  156.     huffman.print();
  157.     huffman.printHuffmanTable();
  158.  
  159.  
  160.  
  161.  
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement