哈希表

哈希表是什么

是一种用于存储键值对(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();  // 输出整个哈希表的内容

 

posted @ 2025-03-09 23:15  我是格鲁特  阅读(44)  评论(0)    收藏  举报