美文网首页JS学习笔记
原生JS实现哈夫曼编码

原生JS实现哈夫曼编码

作者: puxiaotaoc | 来源:发表于2018-09-26 23:49 被阅读29次
function Huffman(str) {
    // 需要编码的字符串
    this.str = str;
    // 键和频率映射表
    this.keyCountMap = null;
    // 编码和键的映射表
    this.codeKeyMap = {};
    // 键和编码的映射表
    this.keyCodeMap = {};
    // 哈夫曼树节点列表
    this.nodeList = null;
    // 哈夫曼树根节点
    this.root = null;
    // 哈夫曼编码后的01序列
    this.code = null;
  }
  Huffman.prototype.cal = function cal() {
    str = this.str;
    var map = {};
    var i = 0;
    while (str[i]) {
      map[str[i]] ? map[str[i]]++ : (map[str[i]] = 1);
      i++;
    }
    this.keyCountMap = map;
  }
  Huffman.prototype.sort = function sort() {
    map = this.keyCountMap;
    var result = [];
    for (key in map) {
      if (map.hasOwnProperty(key)) {
        var obj = {
          key: key,
          val: map[key]
        };
        result.push(new Node(null, null, obj));
      }
    }
    this.nodeList = result.sort(function(x, y) {
      return x.data.val > y.data.val
    });
    console.log(result);
  }

  function Node(left, right, data) {
    this.left = left;
    this.right = right;
    this.data = data;
  }
  Huffman.prototype.makeTree = function makeTree() {
    var i = 0;
    var len = this.nodeList.length;
    var node1;
    var node2;
    var parentNode;
    var table = this.nodeList;
    while (table.length > 1) {
      parentNode = new Node(table[i], table[i + 1], {
        key: null,
        val: table[i]['data'].val + table[i + 1]['data'].val
      });
      table.splice(i, 2);
      table.push(parentNode);
      table.sort(function(x, y) {
        return x.data.val > y.data.val
      });
    }
    this.root = table[0] || new Node();
    console.log(table);
    return this.root;
  }

  Huffman.prototype.traversal = function traversal(tree, code) {
    if (tree.left !== null) {
      traversal.call(this, tree.left, code + '0');
    } else {
      this.keyCodeMap[tree.data.key] = code;
    }
    if (tree.right !== null) {
      traversal.call(this, tree.right, code + '1');
    } else {
      this.keyCodeMap[tree.data.key] = code;
    }

  }


  Huffman.prototype.encode = function encode() {
    this.cal();
    this.sort();
    var root = this.makeTree();
    this.traversal(root, '');
    var ret = this.keyCodeMap;
    var i = 0;
    var result = '';
    var str = this.str;
    while (str[i]) {
      result += ret[str[i++]];
    }
    this.code = result;
    console.log(result);
    return result
  }


  var str = 'abbcccdddd';
  var huffman = new Huffman(str);
  huffman.encode(str);

参考链接:
js实现的哈夫曼编码

相关文章

网友评论

    本文标题:原生JS实现哈夫曼编码

    本文链接:https://www.haomeiwen.com/subject/eirsoftx.html