コード例 #1
0
ファイル: huffman.cpp プロジェクト: realm01/huffman-cpp
std::string* Huffman::decompress(const std::vector<bool>* input) {
  encode = false;
  if(encoding == NULL || encoding->data == NULL || encoding->freqs == NULL)
    throw "no encoding set";

  encoded = (void*)(new std::string());
  LL* linkedlist = new LL();
  unsigned int ll_size = 0;

  for(unsigned int i = 0; i < encoding->data->size(); i++) {
    linkedlist->insert(new Node(new char(encoding->data->at(i)), encoding->freqs->at(i)));
    ll_size++;
  }

  BinaryTree* bst = new BinaryTree(linkedlist, ll_size);

  Node* curr_node = bst->getFirst();

  for(unsigned int i = 0; i < input->size() - overflow; i++) {
    if(!input->at(i)) {
      if(curr_node->left != NULL)
        curr_node = curr_node->left;
    }else if(input->at(i)) {
      if(curr_node->right != NULL)
        curr_node = curr_node->right;
    }
    if(curr_node->left == NULL && curr_node->right == NULL) {
      if(curr_node->character != NULL) {
        const char tmp[] = {*(curr_node->character), '\0'};
        *((std::string*)encoded) += std::string(tmp);
      }
      curr_node = bst->getFirst();
    }
  }

  delete linkedlist;
  delete bst;

  return (std::string*)encoded;
}
コード例 #2
0
ファイル: huffman.cpp プロジェクト: realm01/huffman-cpp
std::vector<bool>* Huffman::compress(const char* input, const size_t& size) {
  encode = true;
  LL* linkedlist = new LL();
  unsigned int ll_size = 0;

  for(unsigned int i = 0; i < size; i++) {
    int* freq = linkedlist->getFreq(input[i]);
    if(freq == NULL) {
      linkedlist->insert(new Node(new char(input[i])));
      ll_size++;
    }else{
      (*freq)++;
    }
  }

  // sort linked list
  // I will use bubblesort, because we will have not so many
  Node* t0;

  for(int j = ll_size - 1; j > 0; j--) {
    for(int i = 0; i < j; i++) {
      LL* ll_f = linkedlist->get(i);
      LL* ll_s = linkedlist->get(i+1);
      if(ll_f->tree->freq > ll_s->tree->freq) {
        t0 = ll_f->tree;
        ll_f->tree = ll_s->tree;
        ll_s->tree = t0;
      }
    }
  }

  BinaryTree* bst = new BinaryTree(linkedlist, ll_size);

  std::unordered_map<char, std::vector<bool> >* map = new std::unordered_map<char, std::vector<bool> >();
  bst->generateMapping(map);

  encoded = (void*)(new std::vector<bool>());

  for(unsigned int i = 0; i < size; i++) {
    std::vector<bool>::iterator iter = map->at(input[i]).begin();
    while(iter != map->at(input[i]).end()) {
      ((std::vector<bool>*)encoded)->push_back(*iter);
      iter++;
    }
  }

  delete map;

  this->encoding = new Huffman::Encoding();
  this->encoding->data = new std::vector<char>();
  this->encoding->freqs = new std::vector<int>();

  for(int i = ll_size - 1; i >= 0 ; i--) {
    this->encoding->data->push_back(*(linkedlist->get(i)->tree->character));
    this->encoding->freqs->push_back(linkedlist->get(i)->tree->freq);
  }

  delete linkedlist;
  delete bst;

  return (std::vector<bool>*)encoded;
}