返回
前端算法系列(4):剖析散列表和js引擎中的对象实现
前端
2023-10-03 23:06:38
定义
散列表(hash table),也称哈希表,是根据键(key)而直接访问在内存存储位置的数据结构。
散列表利用了数组的特点,就是通过数组下标快速访问数组元素的特性,根据键计算出下标值,这样就能直接得到指定键的数据了。这个计算下标值的函数叫做哈希函数(hash function)。
基本操作
散列表的基本操作包括:
- 查找(search):根据键查找表中的元素。
- 插入(insert):将一个新元素插入表中。
- 删除(delete):从表中删除一个元素。
在js引擎中的实现
在js引擎中,散列表通常使用对象来实现。对象的键是一个字符串,而值是一个任意类型的值。要查找对象中的某个键,可以使用方括号语法,如:
const obj = {
name: 'John Doe',
age: 30
};
console.log(obj['name']); // John Doe
要插入一个新的键值对,可以使用赋值运算符,如:
obj['email'] = 'johndoe@example.com';
要删除一个键值对,可以使用delete运算符,如:
delete obj['age'];
碰撞处理
当两个键散列到相同的下标时,就会发生碰撞(collision)。为了处理碰撞,可以使用以下几种方法:
- 线性探测法:从发生碰撞的下标开始,依次向后查找,直到找到一个空的位置。
- 二次探测法:从发生碰撞的下标开始,以一定的步长向后查找,直到找到一个空的位置。
- 链地址法:在发生碰撞的下标处创建一个链表,将所有哈希到该下标的元素插入到链表中。
常见的散列表实现
除了对象之外,散列表还可以使用其他数据结构来实现,如:
- 数组:数组是实现散列表最简单的方法,但它的缺点是查找效率较低。
- 链表:链表可以实现散列表,而且查找效率较高,但它的缺点是插入和删除元素的效率较低。
- 红黑树:红黑树是一种自平衡二叉搜索树,可以实现散列表,而且查找、插入和删除元素的效率都很高。
使用散列表来实现哈希表
哈希表(hash map)是一种数据结构,它使用散列表来存储键值对。哈希表的特点是查找、插入和删除元素的效率都非常高。
要使用散列表来实现哈希表,可以按照以下步骤进行:
- 创建一个散列表。
- 将键值对插入到散列表中。
- 要查找某个键对应的值,可以使用散列表的查找操作。
- 要插入一个新的键值对,可以使用散列表的插入操作。
- 要删除一个键值对,可以使用散列表的删除操作。
总结
散列表是一种非常重要的数据结构,它可以实现接近o(1)的时间复杂度。散列表在js引擎中通常使用对象来实现。在js中使用散列表来实现哈希表非常简单,只需要按照上面的步骤进行即可。