算法——查找之散列表

本文介绍了散列表作为快速查找数据结构的原理,包括散列函数的一致性、易计算性和分布均匀性,以及解决冲突的拉链法和线性探测法。拉链法通过链表解决冲突,保持高效查找;线性探测法则利用数组空位解决冲突,但可能需要重新插入键。散列表提供O(1)的查找速度,但不适用于需要排序的应用。
摘要由CSDN通过智能技术生成

前面我们了解二叉树查找,虽然二叉树的查找已经很快了,但是仍然需要O(logn)的时间复杂度。我们能不能更快呢?我们就想到了一个方法,如果我们能够把所有查找的键转化为一个唯一的数字,那么我们就可以采用数组的形式来存放键和值,那么存取的速度就会非常快了,时间复杂度是O(1)。

如果没有内存限制,我们可以做一个超大的数组来存放,那么所有查找都只需要一次访问就可以得到了。

但是显然,我们并没有这么大的内存来存放数组。所以我们只能选择一个折中的办法,就是采用散列表的形式。


散列表的实现需要解决以下两个问题:

1.散列函数

2.冲突解决


散列函数

散列函数需要满足什么条件呢?

1.一致性

2.易于计算

3.分布均匀


一致性

对于同一个键,使用散列函数计算得到的数组下标,每次计算都应该是一致的。

易于计算

使用散列函数计算数组的下标应该是高效的,否则就失去了散列表的特性。

分布均匀

使用散列表计算多个键得到的下标应该分布均匀,否则也会失去散列表的高效性。


因为键可能是各种各样类型的键,考虑到分布均匀的特征,我们应该将整个键映射成一个下标,而不是只使用键的一部分。例如:Date类型的键,应该充分考虑到day,month,year所有的因素。

幸运的是,对于java,它提供了hashCode()函数,对于大部分的数据类型,我们不必操心他们的散列函数。当

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值