js模擬實現哈希表

  在算法中,尤爲是有關數組的算法中,哈希表的使用能夠很好的解決問題,因此這篇文章會記錄一些有關js實現哈希表並給出解決實際問題的例子。html

  說明: 這篇博客所寫並非真正意義的哈希表,只是與哈希表的使用有類似之處。算法

第一部分:相關知識點

屬性的枚舉:數組

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

輸出:函數

即對於對象而言,咱們可使用for in來枚舉對象的屬性。this

 

屬性的刪除spa

    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 來刪除,而且會有一個返回值。 以下:code

 

注意: 通常只有對象的屬性才能夠刪除,而變量是不能刪除的,如:htm

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

這時打印臺輸出false,由於變量是不可被刪除的。對象

 

 

檢測屬性是否存在blog

    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>

 

在實際的使用過程當中,咱們能夠先寫出主要的功能,而後有須要再添加。

相關文章
相關標籤/搜索