哈希表结构_哈希表的实现

哈希表的实现

            1. 这里采用链地址法实现哈希表

            2. 哈希表是一个数组storage, 这个数组中的每一个index对应一个数组(链表也可以)

            3.在数组中将key和value都存进去(最好是这样)

            4. 最终实现的哈希表中的数据形式就是:

                  [[k1, v1], [k2, v2], [k3, v3]...]

            5. 定义3个属性:

                  storage:存放哈希表数据的数组,数组中的每一个元素,又是一个数组

                  count: 已存数据的个数

                  limit: 用于标记数组的长度

            6. 哈希表中的方法

                  1. put(key, value)                  向哈希表中插入和修改元素

                  2. get(key)                         根据给定的key值去获取元素

                  3. remove(key)                      从哈希表中删除元素

                  4. isEmpty()                        判断哈希表是否为空

                  5. size()                           查看哈希表中数据个数

      7. 哈希表的代码实现

     // 哈希表设计

    // 1> 将字符串转成比较大的数字:hashCode

    // 2> 将大的数字hasCode压缩到一定的数值范围之内

    // 3> 这里将字符传换成Unicode编码: A~Z: 65~90   a~z: 97~122

    function hashTable(){
        // 哈希表的属性
        this.storage = [];
        this.count = 0;
        this.limit = 8;

        // 封装哈希函数类
        hashTable.prototype.hashFun = function(str, size){
            // 1. 定义hashCode变量
            var hashCode = 0;

            // 2. 霍纳算法,计算hashCode的值
            for(var i = 0; i < str.length; i++){
                // 这里的常数值37是常用质数值
                hashCode = 37 * hashCode + str.charCodeAt(i);
            }

            // 3. 取余操作
            var index = hashCode % size;

            return index;
        }

        // 1. 向哈希表中插入数据
        hashTable.prototype.put = function(key, value){
            // 将要插入的键转换成哈希码
            var index = this.hashFun(key, this.limit);

            // 根据索引值,取出storage中对应的bucket
            var bucket = this.storage[index];

            // 判断这个bucket是否为空
            if(bucket == undefined){
                // 为空,则创建一个数组,并将新增的数据以数组的形式存入数组
                bucket= [[key, value]];
                this.storage[index] = bucket;
            }else{
                // 若不为空,判断该数据是否为重复数据
                // 若为重复数据,则修改value值,并返回true;
                for(var i = 0; i < bucket.length; i++){
                    if(bucket[i][0] == key){
                        bucket[i][1] = value;
                        return true;
                    }
                }

                // 若不为重复数据,则添加key和value,并返回true;
                bucket.push([key, value]);
                this.count += 1;
                return true
            }
        }

        // 2. 在哈希表中查找数据
        hashTable.prototype.get = function(key){
            // 首先计算输入key值的哈希码
            var index = this.hashFun(key, this.limit);

            // 取出哈希码对应的那个bucket
            var bucket = this.storage[index];
            if(bucket == undefined){
                return null;
            }

            // 依次遍历这个bucket
            for(var k = 0; k < bucket.length; k++){
                if(bucket[k][0] == key){
                    return bucket[k][1];
                }
            }

            // 若没有找到这个key值,返回null
            return null;
        }

        // 3. 从哈希表中删除元素
        hashTable.prototype.remove = function(key){
            // 首先计算输入key值的哈希码
            var index = this.hashFun(key, this.limit);

            // 根据哈希码.取出对应的bucket
            var bucket = this.storage[index];

            // 依次查找bucket中的元素
            for(var i =0; i < bucket.length; i++){
                if(bucket[i][0] == key){
                    bucket.splice(i, 1);
                    this.count -=1;
                    return true;
                }
            }

            return false;
        }

        // 4. 判断哈希表是否为空
        hashTable.prototype.isEmpet = function(){
            return count == 0;
        }

        // 5. 查看哈希表中的数据个数
        hashTable.prototype.size = function(){
            return this.count;
        }

        // 6. 统计哈希表中存储的数据的分布情况
        hashTable.prototype.sta = function(){
            var sta = [];
            for(var s = 0; s < this.storage.length; s++){
                if(this.storage[s] == undefined){
                    sta.push(0);
                }else{
                    sta.push(this.storage[s].length);
                }
            }
            return sta
        }
    }
View Code

 

posted @ 2020-01-28 16:03  CarreyB  阅读(185)  评论(0编辑  收藏  举报