散列表
1. 直接寻址
2. 散列表
3. 散列函数设计
1. 直接寻址
使用散列的目的是能够快速取得某个元素,那么如果能够保证每个元素都存在一个“槽”的话(类似于数组),就能够完成在O(1)的时间内完成取元素的工作。如果一个集合的元素都是取自全域U={1, 2, ... m},那么通过使用数组T[1,...m]来保证每个元素都存在与之对应的”槽“。
2. 散列表
散列方式下,关键字k是放在h(k)中,显然散列表方法中最主要的是如何设计散列函数,尽可能的减少散列之间的冲突。但是散列中的冲突是无法避免的,那么常见的两种解决方法是:链接法和开放寻址法。
2.1 链接法
链接法的核心思想就是冲突的元素(具有相同的h(k))存放在链表中。
2.2 开放寻址法
开放寻址法的核心思想如下:设具有关键字k的元素,通过散列函数h(x),映射到h(k),如果h(k)已经被占用的话,那么尝试去试探h(k)+ i,依次,直到找到一个合适位置去存放该元素。插入算法如下:
查找的算法也是比较简单,先查找位置h(k),如果不再该位置的话,通过开放寻址探查函数查找下一个位置,知道找到该元素,或者是没有找到。需要指出的是删除元素的情况,如果仅仅是简单讲该位置设为null的话,那么查找将遇到问题。如下图,如果查找5的话,首先查找到1,然后查找到3的时候,null表明已经结束,函数将返回“未找到”。解决方法就是删除时将3的位置设为特殊的标记IsDelete,然后查找时如果遇到IsDelete,那么继续向下查找。
3. 散列函数的设计
3.1 散列函数的需求
显然如果要保证散列的高效性的话,需要将待散列的元素均匀的分布到各个槽中。
3.2 常见的散列函数
3.2.1 除法散列函数
3.2.2 乘法散列函数
(0 < A < 1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?