Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  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');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement