【杂谈】Hash表与平衡树
hash表与平衡树查询数据的时间复杂度是多少?
hash表为O(1),平衡树为O(logn)
这个时间复杂度是如何得出的?
时间复杂度是按照最糟糕的情况来的。但即使是最糟糕的情况,hash表也只需要计算一次,就可以定位到数据(对于常见的实现,实际上是定位到桶,然后在桶内遍历)。而对于平衡树,例如AVL树,由于数据是有序的,比对的最大次数就是树的深度。
明明hash表查询更快,数据库为什么不用hash表?
我能想到的有两方面,一个是平衡树的有序特性,另一个就是hash表的扩容问题。
有序有什么用?
假设数据库中有1百万条数据,有100条的id>xxx。现在我们要从这一百万条数据中,取出这100条id>xxx的数据。由于平衡树是有序的,只要找到xxx这个主键,就可以顺藤摸瓜,得到所有的大于xxx的用户。而对于hash表,它只能把每个数据都拿出来比对一遍。
hash表的扩容问题是什么?
我们常见的hash表实现,是基于数组实现的,用拉链法解决hash冲突。基于数组的固定大小,我们才方便进行hash计算。但是当数据量上去的时候,每个hash桶内的元素会越来越多,必然影响到查询。所以一般都会在达到临界值的时候,进行扩容。找一片更大的空间,然后把旧数据移入新空间中,这个过程需要重hash。数据量一大的话,重hash的时间成本非常高。
可以尽量避免重hash吗?
可以是可以。前提是我们知晓将要存入的数据大概在什么范围,这样的话就可以在初始化hash表的时候指定大小。但是对于数据库这种应用,我们没办法确定到底会放多少数据进去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库