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 +=...