javascript
【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表
前言
【从蛋壳到满天飞】JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组)、Stacks(栈)、Queues(队列)、LinkedList(链表)、Recursion(递归思想)、BinarySearchTree(二分搜索树)、Set(集合)、Map(映射)、Heap(堆)、PriorityQueue(优先队列)、SegmentTree(线段树)、Trie(字典树)、UnionFind(并查集)、AVLTree(AVL 平衡树)、RedBlackTree(红黑平衡树)、HashTable(哈希表)
源代码有三个:ES6(单个单个的 class 类型的 js 文件) | JS + HTML(一个 js 配合一个 html)| JAVA (一个一个的工程)
全部源代码已上传 github,点击我吧,光看文章能够掌握两成,动手敲代码、动脑思考、画图才可以掌握八成。
本文章适合 对数据结构想了解并且感兴趣的人群,文章风格一如既往如此,就觉得手机上看起来比较方便,这样显得比较有条理,整理这些笔记加源码,时间跨度也算将近半年时间了,希望对想学习数据结构的人或者正在学习数据结构的人群有帮助。
哈希表
哈希表相对于之前实现的那些数据结构来说
通过 leetcode 上的题目来看哈希表
哈希表是对于你所关注的内容将它转化成索引
这种情况下很多时候就不得不处理一个在哈希表中非常关键的问题
哈希表充分的体现了算法设计领域的经典思想
对哈希表整体来说这个数组能开多大空间是非常重要的
哈希函数的设计
哈希表这种数据结构
对于哈希表来说,关心的主要有两部分内容
哈希函数的设计
最一般的哈希函数设计原则
取模的数字选择很重要,
浮点型的哈希函数设计
将浮点型的数据转化为一个整数的索引,
在计算机中都 32 位或者 64 位的二进制表示,只不过计算机解析成了浮点数,
如果键是浮点型的话,那么就可以使用浮点型所存储的这个空间,
把它当作是整型来进行处理,
也就是把这个浮点型所占用的 32 位空间或 64 位空间使用整数的方式来解析,
那么这篇空间同样可以可以表示一个整数,
之后就可以将一个大的整数转成整数相应的方式,也就是取模的方式,
这样就解决了浮点型的哈希函数的设计的问题
// // 单精度 // 8-bit 23-bit // 0 | 0 1 1 1 1 1 0 0 | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // 31 23 0// //双进度 // 11-bit 52-bit // 0|011111111100|0100000000000000000000000000000000000000000000000000 // 63 52 0 复制代码字符串的哈希函数设计
复合类型的哈希函数设计
哈希函数设计一般来说对任何数据类型都是将它转换成整型来处理。
哈希函数的设计,通常要遵循三个原则
js 中 自定义 hashCode 方法
在 js 中自定义数据类型
Student
// Student class Student {constructor(grade, classId, studentName, studentScore) {this.name = studentName;this.score = studentScore;this.grade = grade;this.classId = classId;}//@Override hashCode 2018-11-25-jwlhashCode() {// 选择进制const B = 31;// 计算hash值let hash = 0;hash = hash * B + this.getCode(this.name.toLowerCase());hash = hash * B + this.getCode(this.score);hash = hash * B + this.getCode(this.grade);hash = hash * B + this.getCode(this.classId);// 返回hash值return hash;}//@Override equals 2018-11-25-jwlequals(obj) {// 三重判断if (!obj) return false;if (this === obj) return true;if (this.valueOf() !== obj.valueOf()) return false;// 对属性进行判断return (this.name === obj.name &&this.score === obj.score &&this.grade === obj.grade &&this.classId === obj.classId);}// 拆分字符生成数字 -getCode(s) {s = s + '';let result = 0;// 遍历字符 计算结果for (const c of s) result += c.charCodeAt(0);// 返回结果return result;}//@Override toString 2018-10-19-jwltoString() {let studentInfo = `Student(name: ${this.name}, score: ${this.score})`;return studentInfo;} } 复制代码Main
// main 函数 class Main {constructor() {// var s = "leetcode";// this.show(new Solution().firstUniqChar(s) + " =====> 返回 0.");// var s = "loveleetcode";// this.show(new Solution().firstUniqChar(s) + " =====> 返回 2.");const jwl = new Student(10, 4, 'jwl', 99);this.show(jwl.hashCode());console.log(jwl.hashCode());const jwl2 = new Student(10, 4, 'jwl', 99);this.show(jwl2.hashCode());console.log(jwl2.hashCode());}// 将内容显示在页面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割线alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 页面加载完毕 window.onload = function() {// 执行主函数new Main(); }; 复制代码哈希冲突的处理-链地址法(Seperate Chaining)
实现自己的哈希表
代码示例
MyHashTable
// 自定义的hash生成类。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 这个hash没有进行保存 就生成,并且记录let hash = this.calcHashTwo(key);// 记录this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的数字比较小 六七位数 以下 辅助函数:生成hash -calcHashOne(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 取小数部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的数字很大 十几位数 左右 辅助函数:生成hash -calcHashTwo(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定义的哈希表 HashTable 基于使系统的Map 底层是哈希表+红黑树 // 自定义的哈希表 HashTable 基于自己的AVL树 class MyHashTableByAVLTree {constructor(M = 97) {this.M = M; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.contains(key)) {value = map.remove(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} } 复制代码Main
// main 函数 class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循环添加随机数的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());const hashTable = new MyHashTableByAVLTree(1572869);const hashTable1 = new MyHashTableBySystem(1572869);const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 删除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:console.log(hashTableInfo);console.log(hashTable);this.show(hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 删除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:console.log(hashTableInfo1);console.log(hashTable1);this.show(hashTableInfo1);}// 将内容显示在页面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割线alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 页面加载完毕 window.onload = function() {// 执行主函数new Main(); }; 复制代码哈希表的动态空间处理与复杂度分析
哈希表的时间复杂度
哈希表的动态空间处理
代码示例
MyHashTable
// 自定义的hash生成类。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 这个hash没有进行保存 就生成,并且记录let hash = this.calcHashTwo(key);// 记录this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的数字比较小 六七位数 以下 辅助函数:生成hash -calcHashOne(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 取小数部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的数字很大 十几位数 左右 辅助函数:生成hash -calcHashTwo(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定义的哈希表 HashTable // 自定义的哈希表 HashTable class MyHashTableByAVLTree {constructor(M = 97) {this.M = M; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}// 设定扩容的上边界this.upperTolerance = 10;// 设定缩容的下边界this.lowerTolerance = 2;// 初始容量大小为 97this.initCapcity = 97;}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;// 平均元素个数 大于等于 当前容量的10倍// 扩容就翻倍if (this.size >= this.upperTolerance * this.M)this.resize(2 * this.M);}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.contains(key)) {value = map.remove(key);this.size--;// 平均元素个数 小于容量的2倍 当然无论怎么缩容,缩容之后都要大于初始容量if (this.size < this.lowerTolerance * this.M &&this.M / 2 > this.initCapcity)this.resize(Math.floor(this.M / 2));}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);}// 重置空间大小resize(newM) {// 初始化新空间const newHashTable = new Array(newM);for (var i = 0; i < newM; i++) newHashTable[i] = new MyAVLTree();const oldM = this.M;this.M = newM;// 方式一// let map;// let keys;// for (var i = 0; i < oldM; i++) {// // 获取所有实例// map = this.hashTable[i];// keys = map.getKeys();// // 遍历每一对键值对 实例// for(const key of keys)// newHashTable[this.hash(key)].add(key, map.get(key));// }// 方式二let etities;for (var i = 0; i < oldM; i++) {etities = this.hashTable[i].getEntitys();for (const entity of etities)newHashTable[this.hash(entity.key)].add(entity.key,entity.value);}// 重新设置当前hashTablethis.hashTable = newHashTable;} } 复制代码Main
// main 函数 class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循环添加随机数的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());this.alterLine('HashTable Comparison Area');const hashTable = new MyHashTableByAVLTree();const hashTable1 = new MyHashTableBySystem();const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 删除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:console.log('HashTableByAVLTree' + ':' + hashTableInfo);console.log(hashTable);this.show('HashTableByAVLTree' + ':' + hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 删除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:console.log('HashTableBySystem' + ':' + hashTableInfo1);console.log(hashTable1);this.show('HashTableBySystem' + ':' + hashTableInfo1);}// 将内容显示在页面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割线alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 页面加载完毕 window.onload = function() {// 执行主函数new Main(); }; 复制代码哈希表更复杂的动态空间处理方法
哈希表的复杂度分析
更复杂的动态空间处理方法
代码示例
MyHashTable
// 自定义的hash生成类。 class MyHash {constructor() {this.store = new Map();}// 生成hashhashCode(key) {let hash = this.store.get(key);if (hash !== undefined) return hash;else {// 如果 这个hash没有进行保存 就生成,并且记录let hash = this.calcHashTwo(key);// 记录this.store.set(key, hash);// 返回hashreturn hash;}}// 得到的数字比较小 六七位数 以下 辅助函数:生成hash -calcHashOne(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 取小数部分的字符串hash = hash.toString().replace(/^\d*\.\d*?([1-9]+)$/, '$1');hash = parseInt(hash); // 取整return hash;}// 得到的数字很大 十几位数 左右 辅助函数:生成hash -calcHashTwo(key) {// 生成hash 随机小数 * 当前日期毫秒 * 随机小数let hash = Math.random() * Date.now() * Math.random();// hash 向下取整hash = Math.floor(hash);return hash;} }class MyHashTableBySystem {constructor(M = 97) {this.M = M; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new Map();}}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.has(key)) map.set(key, value);else {// 不存在就添加map.set(key, value);this.size++;}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.has(key)) {value = map.delete(key);this.size--;}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.has(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].has(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);} }// 自定义的哈希表 HashTable // 基于系统的哈希表,用来测试 // 自定义的哈希表 HashTable // 基于自己实现的AVL树 class MyHashTableByAVLTree {constructor() {// 设定扩容的上边界this.upperTolerance = 10;// 设定缩容的下边界this.lowerTolerance = 2;// 哈希表合理的素数表this.capacity = [53,97,193,389,769,1543,3079,6151,12289,24593,49157,98317,196613,393241,786433,1572869,3145739,6291469,12582917,25165843,50331653,100663319,201326611,402653189,805306457,1610612741];// 初始容量的索引this.capacityIndex = 0;this.M = this.capacity[this.capacityIndex]; // 空间大小this.size = 0; // 实际元素个数this.hashTable = new Array(this.M); // 哈希表this.hashCalc = new MyHash(); // 哈希值计算// 初始化哈希表for (var i = 0; i < this.M; i++) {// this.hashTable[i] = new MyAVLTree();this.hashTable[i] = new MyAVLTreeMap();}}// 根据key生成 哈希表索引hash(key) {// 获取哈希值let hash = this.hashCalc.hashCode(key);// 对哈希值转换为32位的整数 再进行取模运算return (hash & 0x7fffffff) % this.M;}// 获取实际存储的元素个数getSize() {return this.size;}// 添加元素add(key, value) {const map = this.hashTable[this.hash(key)];// 如果存在就覆盖if (map.contains(key)) map.set(key, value);else {// 不存在就添加map.add(key, value);this.size++;// 平均元素个数 大于等于 当前容量的10倍,同时防止索引越界// 就以哈希表合理的素数表 为标准进行 索引的推移if (this.size >= this.upperTolerance * this.M &&this.capacityIndex + 1 < this.capacity.length)this.resize(this.capacity[++this.capacityIndex]);}}// 删除元素remove(key) {const map = this.hashTable[this.hash(key)];let value = null;// 存在就删除if (map.contains(key)) {value = map.remove(key);this.size--;// 平均元素个数 小于容量的2倍 当然无论怎么缩容,索引都不能越界if (this.size < this.lowerTolerance * this.M &&this.capacityIndex > 0)this.resize(this.capacity[--this.capacityIndex]);}return value;}// 修改操作set(key, value) {const map = this.hashTable[this.hash(key)];if (!map.contains(key)) throw new Error(key + " doesn't exist!");map.set(key, value);}// 查找是否存在contains(key) {return this.hashTable[this.hash(key)].contains(key);}// 查找操作get(key) {return this.hashTable[this.hash(key)].get(key);}// 重置空间大小resize(newM) {// 初始化新空间const newHashTable = new Array(newM);for (var i = 0; i < newM; i++) newHashTable[i] = new MyAVLTree();const oldM = this.M;this.M = newM;// 方式一// let map;// let keys;// for (var i = 0; i < oldM; i++) {// // 获取所有实例// map = this.hashTable[i];// keys = map.getKeys();// // 遍历每一对键值对 实例// for(const key of keys)// newHashTable[this.hash(key)].add(key, map.get(key));// }// 方式二let etities;for (var i = 0; i < oldM; i++) {etities = this.hashTable[i].getEntitys();for (const entity of etities)newHashTable[this.hash(entity.key)].add(entity.key,entity.value);}// 重新设置当前hashTablethis.hashTable = newHashTable;} } 复制代码Main
// main 函数 class Main {constructor() {this.alterLine('HashTable Comparison Area');const n = 2000000;const random = Math.random;let arrNumber = new Array(n);// 循环添加随机数的值for (let i = 0; i < n; i++) arrNumber[i] = Math.floor(n * random());this.alterLine('HashTable Comparison Area');const hashTable = new MyHashTableByAVLTree();const hashTable1 = new MyHashTableBySystem();const performanceTest1 = new PerformanceTest();const that = this;const hashTableInfo = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable.add(word, String.fromCharCode(word));that.show('size : ' + hashTable.getSize());console.log('size : ' + hashTable.getSize());// 删除for (const word of arrNumber) hashTable.remove(word);// 查找for (const word of arrNumber)if (hashTable.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:13249console.log('HashTableByAVLTree' + ':' + hashTableInfo);console.log(hashTable);this.show('HashTableByAVLTree' + ':' + hashTableInfo);const hashTableInfo1 = performanceTest1.testCustomFn(function() {// 添加for (const word of arrNumber)hashTable1.add(word, String.fromCharCode(word));that.show('size : ' + hashTable1.getSize());console.log('size : ' + hashTable1.getSize());// 删除for (const word of arrNumber) hashTable1.remove(word);// 查找for (const word of arrNumber)if (hashTable1.contains(word))throw new Error("doesn't remove ok.");});// 总毫秒数:5032console.log('HashTableBySystem' + ':' + hashTableInfo1);console.log(hashTable1);this.show('HashTableBySystem' + ':' + hashTableInfo1);}// 将内容显示在页面上show(content) {document.body.innerHTML += `${content}<br /><br />`;}// 展示分割线alterLine(title) {let line = `--------------------${title}----------------------`;console.log(line);document.body.innerHTML += `${line}<br /><br />`;} }// 页面加载完毕 window.onload = function() {// 执行主函数new Main(); }; 复制代码哈希表的更多话题
更多哈希冲突的处理方法
总结
以上是生活随笔为你收集整理的【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 2018-2019 Exp2 后门原理与
- 下一篇: JS第三方中间件的延伸