数据结构与算法03-散列表(哈希表)

介绍

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在存储器存储位置的数据结构。也就是说,它通过计算出一个键值的函数,将所需查询的数据映射到表中一个位置来让人访问,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

大多数编程语言都自带散列表这种能够快速读取的数据结构。但在不同的语言中,它有不同
的名字,除了散列表,还有散列、映射、散列映射、字典、关联数组。

  • 原理
    一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名X到首字母首字母F(X)的一个函数关系),在首字母为W的表中查找“王”姓的电话号码,显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中散列函数的函数法则F(),存放首字母的表对应散列表。关键字和函数法则理论上可以任意确定.

从散列表里读取数据只需要 O(1),因为其过程所花的时间是恒定的。它总是先计算出键的散列值,然后根据散列值跳到对应的格子去。

hash冲突情况✍

当不同的key计算出相同的散列值,往已被占用的格子里放东西,会造成冲突。

一种经典的做法就是分离链接。当冲突发生时,我们不是将值放到格子里,而是放到该格子所关联的数组里。
在这里插入图片描述
散列表的格子含有数组,因为要在这些数组上做线性查找,所以步数会多于 1。如果数据
都刚好存在同一个格子里,那么查找就相当于在数组上进行。因此散列表的最坏情况就是 O(N).

存储和效率平衡

一个好的散列函数,应当能将数据分散到所有可用的格子里去。
使用散列表时所需要权衡的:既要避免冲突,又要节约空间

使用场景

适用于检查数据的存在性

  • 用散列表来收集票数
var votes = {};
function addVote(candidate) {
  if (votes[candidate]) {
    votes[candidate]++;
  } else {
    votes[candidate] = 1;
  }
}

function countVotes() {
  return votes;
}

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值