散列表-再思考

本文解析了散列表如何利用数组的随机访问特性,并介绍散列函数在处理字符串索引中的作用。深入探讨理想散列函数的要求,以及散列冲突的两种常见解决方法:开放寻址法和链表法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​散列表具有和数组相同的可以根据下标实现随机访问的特性。

 

数组查找的特性】:
数组的存储空间是连续的,因此对取值(访问)操作比较友好,支持根据下标实现随机访问,时间复杂度为 O(1)。

散列表】:
散列表采用了数组可以根据下标实现随机访问,时间复杂度为 O(1) 的特性。


问 1:那散列表是怎样将数组的特性应用到自身的呢?

答 1 :

数组的下标本质上是一个索引,通过 索引 找到对应位置存放的 值。

散列表也是通过一个索引来访问对应位置存储的

 

数组的索引只能是整数下标,即 0,1,... ,n

散列表的索引可以是任意整数或者字符串,可以根据实际应用的需求设置。

 

问 2 :那散列表是怎样实现使字符串也可以作为索引的呢?

答 2 :关键就在于散列函数

散列函数可以将任意长度和类型的输入通过散列算法输出一个固定长度的散列值。这个过程可以看做一个映射。即将任何长度的输入映射为固定长度的输出。

 

问 3 :一个理想的散列函数是什么样的?

答 3 :1. 应当使每一个不同输入都有不同的输出

           2. 散列函数的散列值应当是均匀分布的。

然而现实中,对于大规模数据的散列表并不存在如此理想的散列函数。

虽然一个函数可以最大化实现对于不同输入的散列值均匀分布,但是却很难实现每一个输入都单独拥有一个散列值。这种现象可以参考抽屉原理。

抽屉原理:简单的说就是,我有 5 个球,但是却只有 4 个抽屉,把这 5 个球全部装入抽屉里,必定有一个抽屉里有两个球。

 

问 4 :抽屉原理反映在散列表中会出现什么问题呢?

答 4 :散列冲突。

散列冲突就是两个不一样的输入,或者说两个不一样的索引,散列后的散列值却是一样的。

 

问 5 :散列冲突的解决方法?

答 5 开放寻址法 和 链表法。

开放寻址法 : 开放寻址法中所使用的数据结构是数组。当发生散列冲突时,就往后一个一个地寻找空闲位置,然后插入。这种方法只适用于小规模数据,

链表法:将每一个散列值视为一个桶,对落到相同桶里的值使用链表连接起来。

相较于开放寻址法,链表法有更多的可优化空间。比如,对于同一个桶里的值,链表法可以改变数据结构来优化查找时间。可以将链表结构使用二叉树、红黑树等高效的查找的数据结构取代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值