js神秘的電報(bào)密碼 哈弗曼編碼實(shí)現(xiàn)
這篇文章主要介紹了js神秘的電報(bào)密碼 哈弗曼編碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下


哈夫曼編碼,根據(jù)每個(gè)單詞在文本中出現(xiàn)的次數(shù)頻率為權(quán)值,頻率高的權(quán)值大。然后每次取兩個(gè)頻率最小的生成樹,最后生成一顆大樹。從根節(jié)點(diǎn)到該單詞的路徑,左邊為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; //兩個(gè)權(quán)值最小的索引
var m1,m2; //兩個(gè)權(quán)值最小的值
for(var i = 0; i < n ; i++){
m1 = m2 = Infinity; //初始化為最大值
x1 = x2 = -1;
for(var j = 0; j < n+i; j++){ //尋找兩個(gè)權(quán)值最小,且父節(jié)點(diǎn)為-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é)點(diǎn)
HuffNode[x2].parent = n + i;
//創(chuàng)建一個(gè)新的節(jié)點(diǎn)
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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js限制checkbox選中個(gè)數(shù)以限制六個(gè)為例
需要展示多個(gè)checkbox復(fù)選框,而只能允許最多選6個(gè),下面為大家介紹下如何使用js限制checkbox選中個(gè)數(shù),需要的朋友可以參考下2014-07-07
Bootstrap學(xué)習(xí)筆記之js組件(4)
這篇文章主要為大家詳細(xì)介紹了Bootstrap學(xué)習(xí)筆記之js組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
動(dòng)態(tài)創(chuàng)建按鈕的JavaScript代碼
本文給大家分享一段JS實(shí)例代碼介紹動(dòng)態(tài)創(chuàng)建按鈕的方法,需要的朋友參考下本文2016-01-01
用xhtml+css寫的相冊(cè)自適應(yīng) - 類似九宮格[兼容 ff ie6 ie7 opear ]
用xhtml+css寫的相冊(cè)自適應(yīng) - 類似九宮格[兼容 ff ie6 ie7 opear ]...2007-05-05
JavaScript實(shí)現(xiàn)算術(shù)平方根算法-代碼超簡單
實(shí)現(xiàn)算術(shù)平方根的方法有很多種,本文是通過JavaScript實(shí)現(xiàn)的算術(shù)平方根算法,代碼超簡單,超管用,感興趣的朋友跟著腳本之家的小編一起學(xué)習(xí)吧2015-09-09
js數(shù)組方法reduce經(jīng)典用法代碼分享
本文給大家整理了很多關(guān)于js數(shù)組方法reduce的經(jīng)典代碼片段,能夠讓大家更好的理解reduce的實(shí)例用法,一起學(xué)習(xí)下吧。2018-01-01
JSON.stringify(遞歸)與?JSON.parse(有限狀態(tài)自動(dòng)機(jī))的實(shí)現(xiàn)代碼
這篇文章主要介紹了JSON.stringify(遞歸)與?JSON.parse(有限狀態(tài)自動(dòng)機(jī))的實(shí)現(xiàn),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
使用JavaScript實(shí)現(xiàn)檢測(cè)網(wǎng)頁是否為空閑狀態(tài)
最近開發(fā)項(xiàng)目時(shí),常碰到“用戶在一定時(shí)間內(nèi)無任何操作時(shí),跳轉(zhuǎn)到某個(gè)頁面”的需求,所以本文就來使用JavaScript實(shí)現(xiàn)這一要求,需要的可以參考下2024-03-03

