zoukankan      html  css  js  c++  java
  • js模拟实现哈希表

      在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子。

      说明: 这篇博客所写并不是真正意义的哈希表,只是与哈希表的使用有相似之处。

    第一部分:相关知识点

    属性的枚举:

        var person = {
            name: "zzw",
            sex: "Male",
            age: 21
        };
        for (var prop in person) {
             console.log(prop + " ",person[prop]);
        }

    输出:

    即对于对象而言,我们可以使用for in来枚举对象的属性。

    属性的删除

        var person = {
            name: "zzw",
            sex: "Male",
            age: 21
        };
        var ifRemove = delete person.name;
        for (var prop in person) {
             console.log(prop + " ",person[prop]);
        }
        console.log(ifRemove);

    对象的属性可以通过 delete 来删除,并且会有一个返回值。 如下:

    注意: 一般只有对象的属性才可以删除,而变量是不能删除的,如:

        var x = 1;
        console.log(delete x); 

    这时打印台输出false,因为变量是不可被删除的。

    检测属性是否存在

        var person = {
            name: "zzw",
            sex: "Male",
            age: 21
        };
        console.log("age" in person);
        console.log("someOther" in person);

    前者返回true,后者返回false。 即我们可以使用in来确定一个对象是否含有该属性。

    属性的添加

        var person = {
            name: "zzw",
            sex: "Male",
            age: 21
        };
        person["school"] = "XJTU";
        console.log(person);

     属性的添加非常简单,如上所示,最终打印出来的对象是包含 school 属性的。

    第二部分: 使用js实现哈希表

    下面是通过构造函数得到一个哈希表,在使用时只需实例化即可,且下面的功能较为丰富,在实际问题中,我们可以选择性的使用 。

        // 创建构造函数HashTable
        function HashTable() {
            // 初始化哈希表的记录条数size
            var size = 0;
    
            // 创建对象用于接受键值对
            var res = {};
    
            // 添加关键字,无返回值
            this.add = function (key, value) {
    
                //判断哈希表中是否存在key,若不存在,则size加1,且赋值 
                if (!this.containKey(key)) {
                    size++;
                }
    
                // 如果之前不存在,赋值; 如果之前存在,覆盖。
                res[key] = value;
            };
    
            // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
            this.remove = function (key) {
                if (this.containKey(key) && (delete res[key])) {
                    size--;
                }
            };
    
            // 哈希表中是否包含key,返回一个布尔值
            this.containKey = function (key) {
                return (key in res);
            };
    
            // 哈希表中是否包含value,返回一个布尔值
            this.containValue = function (value) {
    
                // 遍历对象中的属性值,判断是否和给定value相等
                for (var prop in res) {
                    if (res[prop] === value) {
                        return true;
                    }
                }
                return false;
            };
    
            // 根据键获取value,如果不存在就返回null
            this.getValue = function (key) {
                return this.containKey(key) ? res[key] : null;
            };
    
            // 获取哈希表中的所有value, 返回一个数组
            this.getAllValues = function () {
                var values = [];
                for (var prop in res) {
                    values.push(res[prop]);
                }
                return values;
            };
    
            // 根据值获取哈希表中的key,如果不存在就返回null
            this.getKey = function (value) {
                for (var prop in res) {
                    if (res[prop] === value) {
                        return prop;
                    }
                }
    
                // 遍历结束没有return,就返回null
                return null;
            };
    
            // 获取哈希表中所有的key,返回一个数组
            this.getAllKeys = function () {
                var keys = [];
                for (var prop in res) {
                    keys.push(prop);
                }
                return keys;
            };
    
            // 获取哈希表中记录的条数,返回一个数值
            this.getSize = function () {
                return size;
            };
    
            // 清空哈希表,无返回值
            this.clear = function () {
                size = 0;
                res = {};
            };
        }

    第三部分: 应用实例

      问题:给定一个整型的数组(无序),找出其中的两个数使得其和为某个指定的值,并返回这两个数的下标(数组下标从0开始),假设数组元素的值各不相同。

      实现如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>哈希表的使用</title>
    </head>
    <body>
        <script>
        function queryIndex(arr, result) {
            var hashTable = new HashTable();
            var arrLength = arr.length;
            var sub = [];
            for (var i = 0; i < arrLength; i++) {
    
                // 扫描一遍,存储下标和值 
                hashTable.add(i, arr[i]);
            }
            for (var j = 0; j < arrLength; j++) {
                if (hashTable.containValue(result - arr[j]) && result !== 2*arr[j]) {
                    // 获取两个下标,跳出循环
                    sub.push(j);
                    var antherIndex = Number(hashTable.getKey(result - arr[j]));
                    sub.push(antherIndex);
                    break;
                }
            }
            if (sub.length !== 0) {
                return sub;
            } else {
                return -1;
            }
    
    
        }
        console.log(queryIndex([1,5,7,3,8], 15)); // 2, 4
        console.log(queryIndex([8,18,28,12,29,17], 46)); // 2, 4
        console.log(queryIndex([8,18,28,12,29,17], 2)); // -1
    
    
         // 创建构造函数HashTable
        function HashTable() {
            // 初始化哈希表的记录条数size
            var size = 0;
    
            // 创建对象用于接受键值对
            var res = {};
    
            // 添加关键字,无返回值
            this.add = function (key, value) {
    
                //判断哈希表中是否存在key,若不存在,则size加1,且赋值 
                if (!this.containKey(key)) {
                    size++;
                }
    
                // 如果之前不存在,赋值; 如果之前存在,覆盖。
                res[key] = value;
            };
    
            // 删除关键字, 如果哈希表中包含key,并且delete返回true则删除,并使得size减1
            this.remove = function (key) {
                if (this.containKey(key) && (delete res[key])) {
                    size--;
                }
            };
    
            // 哈希表中是否包含key,返回一个布尔值
            this.containKey = function (key) {
                return (key in res);
            };
    
            // 哈希表中是否包含value,返回一个布尔值
            this.containValue = function (value) {
    
                // 遍历对象中的属性值,判断是否和给定value相等
                for (var prop in res) {
                    if (res[prop] === value) {
                        return true;
                    }
                }
                return false;
            };
    
            // 根据键获取value,如果不存在就返回null
            this.getValue = function (key) {
                return this.containKey(key) ? res[key] : null;
            };
    
            // 获取哈希表中的所有value, 返回一个数组
            this.getAllValues = function () {
                var values = [];
                for (var prop in res) {
                    values.push(res[prop]);
                }
                return values;
            };
    
            // 根据值获取哈希表中的key,如果不存在就返回null
            this.getKey = function (value) {
                for (var prop in res) {
                    if (res[prop] === value) {
                        return prop;
                    }
                }
    
                // 遍历结束没有return,就返回null
                return null;
            };
    
            // 获取哈希表中所有的key,返回一个数组
            this.getAllKeys = function () {
                var keys = [];
                for (var prop in res) {
                    keys.push(prop);
                }
                return keys;
            };
    
            // 获取哈希表中记录的条数,返回一个数值
            this.getSize = function () {
                return size;
            };
    
            // 清空哈希表,无返回值
            this.clear = function () {
                size = 0;
                res = {};
            };
        }
        </script>
    </body>
    </html>

    在实际的使用过程中,我们可以先写出主要的功能,然后有需要再添加。

      

  • 相关阅读:
    Linux 介绍了相关的文件夹
    mousewheel 与 DOMMouseScroll
    如何粗略分析关键词的优化难度
    好老师 (第九届湖南大学计算机程序设计竞赛)
    Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
    在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
    在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
    在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
    在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
    在Ubuntu上为Android系统编写Linux内核驱动程序
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/6658260.html
Copyright © 2011-2022 走看看