返回

前端算法系列(4):剖析散列表和js引擎中的对象实现

前端

定义

散列表(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)是一种数据结构,它使用散列表来存储键值对。哈希表的特点是查找、插入和删除元素的效率都非常高。

要使用散列表来实现哈希表,可以按照以下步骤进行:

  1. 创建一个散列表。
  2. 将键值对插入到散列表中。
  3. 要查找某个键对应的值,可以使用散列表的查找操作。
  4. 要插入一个新的键值对,可以使用散列表的插入操作。
  5. 要删除一个键值对,可以使用散列表的删除操作。

总结

散列表是一种非常重要的数据结构,它可以实现接近o(1)的时间复杂度。散列表在js引擎中通常使用对象来实现。在js中使用散列表来实现哈希表非常简单,只需要按照上面的步骤进行即可。