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


    散列表,散列函数,碰撞处理解决:线性探测法
    /*
    * 散列表,散列函数,碰撞处理解决:线性探测法
    * 原理:散列表位置碰撞时,检查散列表下一个位置是否为空,为空就存入数据;不为空,继续检测下一个位置。
    * 直到找到一个空的位置为止。
    * 当数组的大小是要存储的数据两倍以上时,线性探测法比开链法好
    *
    * */
    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");
  • 相关阅读:
    Door man
    Borg Maze
    Agri-Net
    Highways
    Truck History
    Arctic Network
    QS Network
    用贝塞尔曲线实现水波效果
    在一个Label上设置多种颜色字体
    用UIImageView作出动画效果
  • 原文地址:https://www.cnblogs.com/baiyangyuanzi/p/6692815.html
Copyright © 2020-2023  润新知