哈希表
哈希表是什么
是一种用于存储键值对(key-value pair)的数据结构。在哈希表中,通过哈希函数将键(key)映射到数组的某个位置(索引),然后在该位置存储对应的值(value)。
哈希表适用于处理需要根据键快速查找的场景,如数据库索引、缓存等。
哈希表的关键特性:
- 键的唯一性:每个键在哈希表中是唯一的。
- 哈希函数:通过哈希函数,将键映射到数组的索引。
- 冲突:当两个不同的键映射到同一个索引时,称为冲突。处理冲突的常见方法有链地址法和开放地址法。
- 链地址法(Chaining):当多个键映射到相同的索引时,将它们存储在一个链表或其他数据结构中。
- 开放地址法(Open Addressing):当发生冲突时,寻找另一个空槽来存储元素。常见的策略有线性探测、二次探测等。
用 JavaScript 实现哈希表
我们可以通过数组来模拟哈希表。在实现时,我们需要考虑以下几个问题:
如何设计一个哈希函数,将键映射到数组的索引。
如何处理冲突。
class HashTable { constructor(size = 50) { this.table = new Array(size); // 初始化一个固定大小的数组 this.size = size; } // 哈希函数:将键映射到数组索引 hash(key) { let hashValue = 0; for (let i = 0; i < key.length; i++) { hashValue += key.charCodeAt(i); // 对每个字符的ASCII值进行求和 } return hashValue % this.size; // 使用取模运算以确保索引在数组范围内 } // 插入键值对 insert(key, value) { const index = this.hash(key); // 计算键的哈希值 if (!this.table[index]) { this.table[index] = []; // 如果当前位置没有存储任何元素,创建一个空数组 } // 插入键值对(处理可能的冲突) const bucket = this.table[index]; for (let i = 0; i < bucket.length; i++) { if (bucket[i][0] === key) { bucket[i][1] = value; // 如果键已经存在,更新对应的值 return; } } bucket.push([key, value]); // 否则插入新的键值对 } // 查找键对应的值 get(key) { const index = this.hash(key); // 计算键的哈希值 const bucket = this.table[index]; if (bucket) { for (let i = 0; i < bucket.length; i++) { if (bucket[i][0] === key) { return bucket[i][1]; // 找到键,返回对应的值 } } } return undefined; // 如果找不到键,返回undefined } // 删除键值对 delete(key) { const index = this.hash(key); // 计算键的哈希值 const bucket = this.table[index]; if (bucket) { for (let i = 0; i < bucket.length; i++) { if (bucket[i][0] === key) { bucket.splice(i, 1); // 删除指定的键值对 return true; } } } return false; // 如果没有找到键,返回false } // 打印哈希表 print() { console.log(this.table); } } // 测试哈希表 const hashTable = new HashTable(); hashTable.insert("name", "John"); hashTable.insert("age", 30); hashTable.insert("email", "john@example.com"); console.log(hashTable.get("name")); // 输出: John console.log(hashTable.get("age")); // 输出: 30 console.log(hashTable.get("email")); // 输出: john@example.com hashTable.delete("age"); console.log(hashTable.get("age")); // 输出: undefined hashTable.print(); // 输出整个哈希表的内容

浙公网安备 33010602011771号