JSFiddle - React, Tailwind, and code Playground

LZW-Like dictionary compression test

by skibulk

JavaScript

// Utilities -------------------------------

var dict = [];

function dictIndexOf(seq) {
  for (var i = 0; i < dict.length; i++) {
    if (dict[i].seq == seq) return i;
  }
  return -1;
}

function dictInsert(seq) {
  var index = dictIndexOf(seq);
  var entry;

  if (index >= 0) {
    entry = dict.splice(index, 1)[0];
    entry.freq++;
  } else {
    entry = {
      seq: seq,
      freq: 1,
      bits: seq.length,
      // time: dict.length
    };
  }

  for (var i = 0; i < dict.length; i++) {
    if (dict[i].freq <= entry.freq) break;
  }

  dict.splice(i, 0, entry);
}

function dictCode(seq) {

  var index = dictIndexOf(seq);
	var codeCount = -1;
	//var branch;
  var code = "0";

  for (var i = 0; i < dict.length; i++) {
  
  	// Huffman dictionary tree method
  	//branch = Math.floor(codeCount / 4);
    //code = branch == 0 ? "0" : "1".repeat(branch);
    //code += (codeCount % 4).toString(2).padStart(2, "0");
    
  	// Use a code if it is shorter than the entry
    if (dict[i].bits > code.length) {
    	codeCount++;
      
	    // Continue method
      code = codeCount.toString(2).split(/.{1,3}/g).join("1") + "0";
      code = code.padEnd(Math.ceil(code.length / 3) * 4, "0");
      //console.log(code);
    }

		// We have arrived at the target entry
    if (i == index) {
      if (dict[i].bits > code.length) {
      	return code;
      } else {
      	return -1;
      }
    }
  }
  return -2;
}

// Get the number of bits in an integer, ignoring sign
function bitLength(val) {
  if (val < 0) val *= -1;
  var r, shift, sval;
  var bit = 0;
  for (r = 4; r >= 0; --r) {
    shift = 1 << r;
    sval = val >> shift;
    if (sval) {
      bit += shift;
      val = sval;
    }
  }
  return bit + 1;
}

function textToBinary(str) {
    return str.split('').map(function (char) {
        return char.charCodeAt(0).toString(2).padStart(8, "0");
    }).join('');
}

// RUN ----------------------------

/*
var data = "";

for(var i = 0; i < 1000; i++){
  data +=...