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

本文介绍了一种散列表碰撞处理方法——线性探测法。通过此方法,在发生碰撞时,散列表会检查下一个位置直至找到空位来存储数据。文章详细展示了线性探测法的具体实现过程,并通过一个示例进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

散列表,散列函数,碰撞处理解决:线性探测法
/*
* 散列表,散列函数,碰撞处理解决:线性探测法
* 原理:散列表位置碰撞时,检查散列表下一个位置是否为空,为空就存入数据;不为空,继续检测下一个位置。
* 直到找到一个空的位置为止。
* 当数组的大小是要存储的数据两倍以上时,线性探测法比开链法好
*
* */
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");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值