7Bpencil

HuffmanCoding

Dec 22nd, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict"
  2. function node(inp_name, inp_fr, inp_used, inp_code, inp_link){
  3.     this.name = inp_name;
  4.     this.frequency = inp_fr;
  5.     this.used = inp_used;
  6.     this.code = inp_code;
  7.     this.link = inp_link;
  8. }
  9.  
  10.  
  11. function Encode(message) {
  12.     let alphabet = GetAlphabetWithFrequency(message);
  13.     let HuffmanTree = CreateLeavesHuffmanTree(alphabet);
  14.     CreateBranchVertexesHuffmanTree(HuffmanTree);
  15.     let codeTable = CreateCodeTable(HuffmanTree);
  16.     let encodedMessage = "";
  17.     for (let i = 0; i < message.length; i++){
  18.         encodedMessage += codeTable[message[i]];
  19.     }
  20.     return encodedMessage;
  21. }
  22.  
  23.  
  24. function GetAlphabetWithFrequency(message) {
  25.     let alphabet = new Array();
  26.     for(let i = 0; i < message.length; i++) {
  27.         let letter = message.charAt(i);
  28.         if ([letter] in alphabet) {
  29.             alphabet[letter] += 1;
  30.         } else {
  31.             alphabet[letter] = 1;
  32.         }
  33.     }
  34.     return alphabet;
  35. }
  36.  
  37.  
  38. function CreateLeavesHuffmanTree(alphabet) {
  39.     let tree = new Array();
  40.     for (let letter in alphabet) {
  41.         tree.push(new node(letter, alphabet[letter], false, '', null));
  42.     }
  43.     return tree;
  44. }
  45.  
  46.  
  47. function CreateBranchVertexesHuffmanTree(tree) {
  48.     let amountOfNotUsedVertexes = tree.length;
  49.     while (true) {
  50.         let mins = GetNotUsedFirstMinAndSecondMin(tree);
  51.         let firstMin = mins[0]; let secondMin = mins[1];
  52.  
  53.         let combName = firstMin.name + secondMin.name;
  54.         let combFrequency = firstMin.frequency + secondMin.frequency;
  55.         let combIndex = tree.length;
  56.  
  57.         tree[combIndex] = new node(combName, combFrequency, false, '', combIndex);
  58.         UpdateUsedVertexes(firstMin, secondMin, combIndex);
  59.         amountOfNotUsedVertexes += 1 - 2;
  60.         if (amountOfNotUsedVertexes == 1) break;
  61.     }
  62. }
  63.  
  64.  
  65. function GetNotUsedFirstMinAndSecondMin(tree) {
  66.     let firstMin = new node("", +Infinity, false, '', NaN);
  67.     let secondMin = new node("", +Infinity, false, '', NaN);
  68.     for (let i = 0; i < tree.length; i++) {
  69.         if (!tree[i].used && (tree[i].frequency < firstMin.frequency)) {
  70.             secondMin = firstMin;
  71.             firstMin = tree[i];
  72.         } else if (!tree[i].used && (tree[i].frequency < secondMin.frequency)) {
  73.             secondMin = tree[i];
  74.         }
  75.     }
  76.     return [firstMin, secondMin];
  77. }
  78.  
  79.  
  80. function UpdateUsedVertexes(firstMin, secondMin, combinationNodeIndex) {
  81.     firstMin.used = true; firstMin.code = "0"; firstMin.link = combinationNodeIndex;
  82.     secondMin.used = true; secondMin.code = "1"; secondMin.link = combinationNodeIndex;
  83. }
  84.  
  85.  
  86. function CreateCodeTable(tree) {
  87.     let codeTable = {};
  88.     for(let i = 0; i < tree.length; i++) {
  89.         if (tree[i].name.length != 1) continue;
  90.         let code = ReadCode(tree[i], tree);
  91.         codeTable[tree[i].name] = reverseString(code);
  92.     }
  93.     return codeTable;
  94. }
  95.  
  96.  
  97. function ReadCode(letterNode, tree) {
  98.     let code = letterNode.code;
  99.     let nextNodeIndex = letterNode.link;
  100.     while (tree[nextNodeIndex].used) {
  101.         code += tree[nextNodeIndex].code;
  102.         nextNodeIndex = tree[nextNodeIndex].link;
  103.     }
  104.     return code;
  105. }
  106.  
  107.  
  108. function reverseString(string) {
  109.     let result = "";
  110.     for (let i = string.length - 1; i >= 0; i--) {
  111.         result += string[i];
  112.     }
  113.     return result;
  114. }
  115.  
  116.  
  117. test();
  118. function test() {
  119.     let str = 'abraсadabra';
  120.     let a = GetAlphabetWithFrequency(str);
  121.     let b = CreateLeavesHuffmanTree(a);
  122.     let x = CreateBranchVertexesHuffmanTree(b);
  123.     let e = Encode(str);
  124.     console.log(e.length);
  125. }
Add Comment
Please, Sign In to add comment