這次帶給大家如何使用JS模擬實作雜湊表,使用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>
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
#以上是如何使用JS模擬實現哈希表的詳細內容。更多資訊請關注PHP中文網其他相關文章!