提问式算法速通--Hash
介绍一下散列表这种重要的数据结构,涵盖了其基本概念、内部机制、性能优化以及常见应用场景。
散列表是一种基于键值对存储数据的数据结构。它通过将键映射到数组索引来实现快速的数据检索。内部机制包括哈希函数用于生成索引,处理冲突的方法如开放地址法或链表法。性能优化可通过选择合适的哈希函数和解决冲突的策略,以及动态调整数组大小来实现。常见应用场景包括数据库索引、缓存系统和唯一标识符存储。
使用 JS 模拟一个散列表的使用场景
// 创建一个散列表 let hashTable = {}; // 添加数据 hashTable["name"] = "John"; hashTable["age"] = 30; hashTable["city"] = "New York"; // 查找数据 let age = hashTable["age"]; console.log("Age:", age); // 输出: Age: 30 // 更新数据 hashTable["age"] = 31; // 删除数据 delete hashTable["city"]; // 检查键是否存在 let hasName = "name" in hashTable; console.log("Has name:", hasName); // 输出: Has name: true
散列表内部通常使用数组来存储元素,并采用散列函数将键映射到数组索引。一旦发生冲突,可以使用链表或开放地址法来解决冲突。
JS 实现
class HashTable { constructor() { this.table = new Array(10); // 使用一个长度为10的数组作为散列表 } // 散列函数 hash(key) { let hash = 0; for (let i = 0; i < key.length; i++) { hash += key.charCodeAt(i); } return hash % this.table.length; } // 插入数据 insert(key, value) { const index = this.hash(key); if (!this.table[index]) { this.table[index] = []; } this.table[index].push({ key, value }); } // 查找数据 search(key) { const index = this.hash(key); if (this.table[index]) { for (let i = 0; i < this.table[index].length; i++) { if (this.table[index][i].key === key) { return this.table[index][i].value; } } } return undefined; } // 删除数据 delete(key) { const index = this.hash(key); if (this.table[index]) { this.table[index] = this.table[index].filter(item => item.key !== key); } } } // 使用散列表 const myHashTable = new HashTable(); myHashTable.insert("name", "John"); myHashTable.insert("age", 30); myHashTable.insert("city", "New York"); console.log("Age:", myHashTable.search("age")); // 输出: Age: 30 myHashTable.delete("city"); console.log("City:", myHashTable.search("city")); // 输出: City: undefined