数据结构-散列表(基础知识)

散列表

散列表

散列表称为 Hash 表,哈希表,Hash Table

给定关键字,计算出关键字在表中的地址的数据结构。散列表建立了关键字和存储地址之间的直接映射关系

散列函数

散列函数

把散列表中关键字映射为对应地址的函数,addr = Hash(key)

散列函数是可能把两个或以上个关键字映射到同一地址下,这种情况成为“冲突”,这些发生冲突的关键字被叫做“同义词”

散列函数的算法应该做到尽量简单好算,散列的地址尽量做到均匀分布来避免集中性的“冲突”

几种散列函数

  • 线性散列函数(直接定址)

    Hash(key) = a * key + b

    简单,并且无冲突

  • 取模的散列函数(除留余数)

    Hash(key) = key % p

    关键在于选好 p,是的均匀分部地址,减少冲突。一般取不大于表长但是接近或等于表长的质数 p

冲突解决

  • 开放定址法

    将产生冲突的 Hash 地址作为自变量,通过某种冲突解决函数,得到新的地址

    • 线性探测

      冲突发生,顺序查找下一个空间,但缺点是大量元素在相邻位置堆积,降低了查找效率

    • 平方探测

    • 再散列法

      第二个散列计算冲突后地址增量

    • 伪随机序列

      冲突后地址增量为伪随机数

  • 拉链法

    把冲突同义词存进线性链表中,这些线性链表由散列地址唯一标识,适用于常增删的场景

散列表与平衡二叉树比较

散列表

快在查找,但是比较占用空间。由于散列函数的存在,散列表查找和插入的时间复杂度为 O(1)。当出现更多数据时候,哈希冲突可能性增加,时间复杂度陡升为 O(n),n 为冲突解决的链表长

平衡二叉树

查找较快(二分法),空间没有散列表消耗大。二叉树查找和插入的时间复杂度 O(log n),n 为树的结点数,二叉树不会像哈希表一样有冲突,所以性能更稳定一些

结论

在少量数据,或者说你预先知道数据量大小并且有足够空间时候,并且无需进行数据比较时候,哈希表是很好的选择。如果是持续的数据插入,数据量不可能空,数据量足够大,存储空间不足时,二叉树算是一个很好的折中选择(查询插入满足二分 O(log n),时间复杂度也比较稳定)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值