Advertisement
JanisPlayer

Huffman-Codierers in JavaScript

Apr 18th, 2023 (edited)
977
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Funktion zum Zählen der Häufigkeit jedes Symbols in der Eingabe
  2. function countFrequencies(str) {
  3.   let freq = {};
  4.  
  5.   for (let i = 0; i < str.length; i++) {
  6.     let char = str[i];
  7.     if (freq[char]) {
  8.       freq[char]++;
  9.     } else {
  10.       freq[char] = 1;
  11.     }
  12.   }
  13.  
  14.   return freq;
  15. }
  16.  
  17. // Klasse, die einen Huffman-Knoten darstellt
  18. class HuffmanNode {
  19.   constructor(symbol, frequency) {
  20.     this.symbol = symbol;
  21.     this.frequency = frequency;
  22.     this.left = null;
  23.     this.right = null;
  24.   }
  25. }
  26.  
  27. // Funktion zum Erstellen des Huffman-Baums aus einer Häufigkeitstabelle
  28. function buildHuffmanTree(freq) {
  29.   let nodes = [];
  30.  
  31.   // Erstelle ein Blatt für jedes Symbol
  32.   for (let symbol in freq) {
  33.     nodes.push(new HuffmanNode(symbol, freq[symbol]));
  34.   }
  35.  
  36.   // Baue den Huffman-Baum, indem die Knoten mit den geringsten Häufigkeiten kombiniert werden
  37.   while (nodes.length > 1) {
  38.     nodes.sort((a, b) => a.frequency - b.frequency);
  39.  
  40.     let left = nodes.shift();
  41.     let right = nodes.shift();
  42.  
  43.     let parent = new HuffmanNode(null, left.frequency + right.frequency);
  44.     parent.left = left;
  45.     parent.right = right;
  46.  
  47.     nodes.push(parent);
  48.   }
  49.  
  50.   return nodes[0];
  51. }
  52.  
  53. // Funktion zum Erstellen einer Huffman-Tabelle aus dem Huffman-Baum
  54. function buildHuffmanTable(node, prefix, table) {
  55.   table = table || {};
  56.  
  57.   if (node.symbol) {
  58.     table[node.symbol] = prefix;
  59.   } else {
  60.     buildHuffmanTable(node.left, prefix + "0", table);
  61.     buildHuffmanTable(node.right, prefix + "1", table);
  62.   }
  63.  
  64.   return table;
  65. }
  66.  
  67. // Funktion zum Codieren eines Strings mit einem Huffman-Code
  68. function encode(str, table) {
  69.   let output = "";
  70.  
  71.   for (let i = 0; i < str.length; i++) {
  72.     let char = str[i];
  73.     output += table[char];
  74.   }
  75.  
  76.   return output;
  77. }
  78.  
  79. // Beispielanwendung
  80. let input = "abracadabra";
  81. let freq = countFrequencies(input);
  82. let tree = buildHuffmanTree(freq);
  83. let table = buildHuffmanTable(tree, "", {});
  84. let encoded = encode(input, table);
  85.  
  86. console.log("Input: ", input);
  87. console.log("Encoded: ", encoded);
  88. console.log("Huffman-Table: ", table);
  89.  
  90. // Funktion zum Decodieren eines Huffman-Codes mit einer Huffman-Tabelle
  91. function decode(encoded, table) {
  92.   let output = "";
  93.   let code = "";
  94.  
  95.   for (let i = 0; i < encoded.length; i++) {
  96.     code += encoded[i];
  97.  
  98.     for (let symbol in table) {
  99.       if (table[symbol] === code) {
  100.         output += symbol;
  101.         code = "";
  102.         break;
  103.       }
  104.     }
  105.   }
  106.  
  107.   return output;
  108. }
  109.  
  110. // Beispielanwendung
  111. let decoded = decode(encoded, table);
  112.  
  113. console.log("Decoded: ", decoded);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement