JS 하프 맨 수 실현
function Huffman(str) {
//
this.str = str;
//
this.keyCountMap = null;
//
this.codeKeyMap = {};
//
this.keyCodeMap = {};
//
this.nodeList = null;
//
this.root = null;
// 01
this.code = null;
}
Huffman.prototype.cal = function cal() {
str = this.str;
var map = {};
var i = 0;
while(str[i]) {
map[str[i]] ? map[str[i]]++ : (map[str[i]] = 1);
i++;
}
this.keyCountMap = map;
}
Huffman.prototype.sort = function sort() {
map = this.keyCountMap;
var result = [];
for (key in map) {
if(map.hasOwnProperty(key)) {
var obj = {
key: key,
val: map[key]
};
result.push(new Node(null, null, obj));
}
}
this.nodeList = result.sort(function(x,y){return x.data.val > y.data.val});
}
function Node(left, right, data) {
this.left = left;
this.right = right;
this.data = data;
}
Huffman.prototype.makeTree = function makeTree() {
var i = 0;
var len = this.nodeList.length;
var node1;
var node2;
var parentNode;
var table = this.nodeList;
while(table.length > 1) {
parentNode = new Node(table[i], table[i+1], {key: null, val: table[i]['data'].val + table[i+1]['data'].val});
table.splice(i,2);
table.unshift(parentNode);
table.sort(function(x,y){return x.data.val > y.data.val});
}
this.root = table[0] || new Node();
return this.root;
}
Huffman.prototype.traversal = function traversal(tree, code) {
if (tree.left !== null) {
traversal.call(this,tree.left, code + '0');
} else {
this.keyCodeMap[tree.data.key] = code;
}
if (tree.right !== null) {
traversal.call(this, tree.right,code + '1');
} else {
this.keyCodeMap[tree.data.key] = code;
}
}
Huffman.prototype.encode = function encode() {
this.cal();
this.sort();
var root = this.makeTree();
this.traversal(root, '');
var ret = this.keyCodeMap;
var i = 0;
var result = '';
var str = this.str;
while(str[i]) {
result += ret[str[i++]];
}
this.code = result;
console.log('encode:' + result);
return result
}
Huffman.prototype.reverseMap = function reverseMap() {
var ret = this.keyCodeMap;
var result = {};
for (key in ret) {
if(ret.hasOwnProperty(key)) {
result[ret[key]] = key;
}
}
this.codeKeyMap = result;
return result;
}
Huffman.prototype.decode = function decode() {
var i = 0;
var result = '';
var data = '';
var map = this.reverseMap();
var str = this.code;
while(str) {
result += str[i++];
if (result in map) {
data += map[result];
str = str.replace(new RegExp("^"+result),'');
result = '';
i = 0;
}
}
console.log("decode:" + data)
}
Huffman.prototype.encodeBase64 = function() {
try {
var base64 = btoa(this.code);
return base64;
} catch(e) {
return '';
}
}
var str = 'ew qew qd ef 24 gf ewr getElementsByTagName';
var huffman = new Huffman(str)
huffman.encode(str)
huffman.decode();
huffman.encodeBase64();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.