您的位置:首页 > 其它

散列表,散列函数,碰撞处理解决:线性探测法

2017-04-11 11:35 369 查看
散列表,散列函数,碰撞处理解决:线性探测法


/*
* 散列表,散列函数,碰撞处理解决:线性探测法
* 原理:散列表位置碰撞时,检查散列表下一个位置是否为空,为空就存入数据;不为空,继续检测下一个位置。
* 直到找到一个空的位置为止。
* 当数组的大小是要存储的数据两倍以上时,线性探测法比开链法好
*
* */
function HashTable() {
this.table = new Array(137);
this.values = [];
this.betterHash = betterHash;
this.showDistro = showDistro;
this.put = put;
this.get = get;
}

// put for linear probing
function put(key, data) {
var pos = this.betterHash(key);
if (this.table[pos] == undefined) {
this.table[pos] = key;
this.values[pos] = data;
}else{
while (this.table[pos] != undefined) {
pos++;
}
this.table[pos] = key;
this.values[pos] = 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() {
for (var i = 0; i < this.table.length; ++i) {
if (this.table[i] != undefined) {
console.log(this.table[i] + ": " + this.values[i]);
}
}
}

// get for linear probing
function get(key) {
var hash = this.betterHash(key);

for (var i = hash; this.table[hash] != undefined; i++) {
if (this.table[hash] == key) {
console.log("查找到的键值为: "+this.values[hash]);
return this.values[hash];
}
}

console.log("无该键值!");
return undefined;
}

/*测试线性探测法*/
var someNames = ["David", "Jennifer", "Donnie", "Raymond",
"Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];
var hTable = new HashTable();
for (var i = 0; i < someNames.length; ++i) {
hTable.put(someNames[i],someNames[i]);
}
hTable.showDistro();
hTable.get("Jennifer");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐