哈希表
大约 2 分钟
哈希表
在计算中, 一个 哈希表(hash table 或hash map) 是一种实现 关联数组(associative array) 的抽象数据类型, 该结构可以将 键映射到值。
哈希表使用 哈希函数/散列函数 来计算一个值在数组或桶(buckets)中或槽(slots)中对应的索引,可使用该索引找到所需的值。
理想情况下,散列函数将为每个键分配给一个唯一的桶(bucket),但是大多数哈希表设计采用不完美的散列函数,这可能会导致"哈希冲突(hash collisions)",也就是散列函数为多个键(key)生成了相同的索引,这种碰撞必须 以某种方式进行处理。

通过单独的链接解决哈希冲突

class HashTable {
constructor() {
this.table = {};
}
// 哈希函数
hash(key) {
let hash = 0;
for (let i = 0; i < key.length; i++) {
hash += key.charCodeAt(i);
}
return hash % 37; // 选择一个适当的哈希表大小,如质数
}
// 向哈希表中插入键值对
put(key, value) {
const index = this.hash(key);
if (!this.table[index]) {
this.table[index] = {};
}
this.table[index][key] = value;
}
// 从哈希表中获取指定键的值
get(key) {
const index = this.hash(key);
if (this.table[index] && this.table[index][key]) {
return this.table[index][key];
}
return undefined;
}
// 从哈希表中移除指定键值对
remove(key) {
const index = this.hash(key);
if (this.table[index] && this.table[index][key]) {
delete this.table[index][key];
if (Object.keys(this.table[index]).length === 0) {
delete this.table[index];
}
return true;
}
return false;
}
// 检查哈希表中是否存在指定键
contains(key) {
const index = this.hash(key);
return !!(this.table[index] && this.table[index][key]);
}
// 返回哈希表中的所有键
keys() {
const keys = [];
for (const index in this.table) {
for (const key in this.table[index]) {
keys.push(key);
}
}
return keys;
}
// 返回哈希表中的所有值
values() {
const values = [];
for (const index in this.table) {
for (const key in this.table[index]) {
values.push(this.table[index][key]);
}
}
return values;
}
}
const hashTable = new HashTable();
hashTable.put("apple", 10);
hashTable.put("banana", 20);
console.log(hashTable.get("apple")); // 输出: 10
console.log(hashTable.contains("banana")); // 输出: true
console.log(hashTable.remove("banana")); // 输出: true
console.log(hashTable.contains("banana")); // 输出: false
console.log(hashTable.keys()); // 输出: ["apple"]
console.log(hashTable.values()); // 输出: [10]

