這篇文章主要介紹了js神秘的電報密碼 哈弗曼編碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
哈夫曼編碼,根據(jù)每個單詞在文本中出現(xiàn)的次數(shù)頻率為權(quán)值,頻率高的權(quán)值大。然后每次取兩個頻率最小的生成樹,最后生成一顆大樹。從根節(jié)點到該單詞的路徑,左邊為0,右邊為1,
function HFM(){ var souce = []; function createNode(node){ var obj = { weight:0, parent:-1, lchild:-1, rchild:-1, value:'' }; return Object.assign(obj,node); } this.addNode = function(node){ //添加單詞和頻率(權(quán)值) souce.push(createNode(node)); } this.createTree = function(){ //哈夫曼樹 var HuffNode = JSON.parse(JSON.stringify(souce)); var n = HuffNode.length; var x1,x2; //兩個權(quán)值最小的索引 var m1,m2; //兩個權(quán)值最小的值 for(var i = 0; i < n ; i++){ m1 = m2 = Infinity; //初始化為最大值 x1 = x2 = -1; for(var j = 0; j < n+i; j++){ //尋找兩個權(quán)值最小,且父節(jié)點為-1的 var item = HuffNode[j]; if(item.weight < m1 && item.parent == -1){ m2 = m1; x2 = x1; m1 = item.weight; x1 = j; }else if(item.weight < m2 && item.parent == -1){ m2 = item.weight;; x2 = j; } } if(x1 != -1 && x2 != -1){ HuffNode[x1].parent = n + i; //更新父節(jié)點 HuffNode[x2].parent = n + i; //創(chuàng)建一個新的節(jié)點 HuffNode[n+i] = createNode({ weight:m1+m2, lchild:x1, rchild:x2 }); } } return HuffNode; }; this.getCode = function(){ //哈夫曼編碼 var n = souce.length; var tree = this.createTree(); var codes = {}; for(var i = 0; i < n; i++){ var p = tree[i].parent; var code = ''; var c = i; while(p != -1){ //迭代前溯 if(tree[p].lchild == c){ code = 0 + code; }else{ code = 1 + code; } c = p; p = tree[p].parent; } codes[ tree[i].value ] = code; console.log(tree[i].value , code); } return codes; } } var hfm = new HFM();hfm.addNode({ weight:5, value:"a"});hfm.addNode({ weight:32, value:"b"});hfm.addNode({ weight:18, value:"c"});hfm.addNode({ weight:7, value:"d"});hfm.addNode({ weight:25, value:"e"});hfm.addNode({ weight:13, value:"f"});console.log(hfm.getCode())
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點
疑難解答