本文實例講述了JS散列表碰撞處理、開鏈法、HashTable散列。分享給大家供大家參考,具體如下:
/** * 散列表碰撞處理、開鏈法、HashTable散列。 * 將數組里的元素位置,也設置為數組,當兩個數據的散列在同一個位置時, * 就可以放在這個位置的二維數組里,解決了散列函數的碰撞處理問題 */function HashTable() { this.table = new Array(137); this.betterHash = betterHash;//散列函數 this.showDistro = showDistro;//顯示散列表里的數據 this.buildChains = buildChains;//生成二維數組 this.put = put;//將數據存儲到散列表 this.get = get;//從散列表中取出某個數據}// put for separate chainingfunction put(key, data) { var pos = this.betterHash(key); var index = 0; if (this.table[pos][index] == undefined) { this.table[pos][index] = data; }else { while (this.table[pos][index] != undefined) { ++index; } this.table[pos][index] = data; }}/*散列函數*/function betterHash(string) { const H = 37; var total = 0; for (var i = 0; i < string.length; ++i) { total += H * total + string.charCodeAt(i); } total = total % this.table.length; if (total < 0) { total += this.table.length-1; } return parseInt(total);}function showDistro() { var n = 0; for (var i = 0; i < this.table.length; ++i) { if (this.table[i][n] != undefined) { console.log(i + ": " + this.table[i]); } }}function buildChains() { for (var i = 0; i < this.table.length; ++i) { this.table[i] = new Array(); }}// get for separate chainingfunction get(key) { var index = 0; var pos = this.betterHash(key); while ((this.table[pos][index] != undefined)&&(this.table[pos][index] != key)) { index += 1; } if(this.table[pos][index] == key) { console.log(key+" 的鍵值為: "+this.table[pos][index]); return this.table[pos][index]; }else{ console.log("無該鍵值"); return undefined; }}/*測試開鏈法*/var someNames = ["David", "Jennifer", "Donnie", "Raymond", "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];var hTable = new HashTable();hTable.buildChains();for (var i = 0; i < someNames.length; ++i) { hTable.put(someNames[i],someNames[i]);}hTable.showDistro();hTable.betterHash("Jennifer");hTable.get("Jennidfer");hTable.get("Jennifer");
可得如下運行結果:
希望本文所述對大家JavaScript程序設計有所幫助。
新聞熱點
疑難解答