Advertisement
Guest User

Script

a guest
Dec 6th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class Node {
  2.     constructor(val) {
  3.         this.value = val;
  4.         this.child = [];
  5.     }
  6.     addLeft(node) {this.child[0] = node}
  7.     addRight(node) {this.child[1] = node}
  8. }
  9.  
  10. function count(str) {
  11.     // strの中のそれぞれの文字の出現回数をカウントする
  12.     const counter = new Map();
  13.     for (const s of str) counter.set(s, counter.has(s) ? counter.get(s) + 1 : 0);
  14.     return [...counter.entries()];
  15. }
  16. function createHuffmanTree(pairs) {
  17.     // pairs:= [['a', 2], ['b', 2], ...]
  18.     pairs = pairs.map(item => [new Node(item[0]), item[1]]);
  19.     while (pairs.length > 1) {
  20.         let min1 = 0, min2 = 1; // min1は最小要素のインデックス、min2は二番目へのインデックス
  21.         if (pairs[min1][1] > pairs[min2][1]) [min1, min2] = [min2, min1];
  22.         for (let i = 2, _i = pairs.length; i < _i; i++) {
  23.             if (pairs[i][1] < pairs[min1][1]) {
  24.                 [min1, min2] = [i, min1];
  25.             } else if (pairs[i][1] < pairs[min2][1]) {
  26.                 min2 = i;
  27.             }
  28.         }
  29.         const parent = new Node(null);
  30.         parent.addLeft(pairs[min1][0]);
  31.         parent.addRight(pairs[min2][0]);
  32.         if (min1 > min2) [min1, min2] = [min2, min1]; // 下でpairsからmin1、min2の要素を取り除くときにspliceを使うため、必要なら入れ替え
  33.         pairs.push([parent, pairs[min1][1] + pairs[min2][1]]);
  34.         pairs.splice(min2, 1); pairs.splice(min1, 1);
  35.     }
  36.     return pairs[0][0];
  37. }
  38. function HuffmanCoding(tree, dic = {}, s = '') {
  39.     if (tree.value !== null) dic[tree.value] = s;
  40.     if (tree.child[0]) dic = HuffmanCoding(tree.child[0], dic, s + '0');
  41.     if (tree.child[1]) dic = HuffmanCoding(tree.child[1], dic, s + '1');
  42.     return dic;
  43. }
  44. const test = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
  45. const huffmanCode = HuffmanCoding(createHuffmanTree(count(test)));
  46. console.log(huffmanCode);
  47. console.log([...test].map(s => huffmanCode[s]).join(''));
  48. console.log(([...test].map(s => huffmanCode[s]).join('').length / 8) + 'byte');
  49.  
  50.  
  51. Another Scripts from here :
  52.  
  53. http://bit.ly/2g63Tj5
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement