数据结构和算法——了解哈希表(哈希查找、散列的基本思想)

简介: 数据结构和算法——了解哈希表(哈希查找、散列的基本思想)

哈希查找

我们之前学过的几种查找方法

  • 顺序查找        
  • 二分查找(静态查找)        
  • 二叉搜索树            h为二叉查找树的高度
  • 平衡二叉树        

还有没有更快的查找方法呢?

我们先看下面的例子:

在登陆QQ的时候,QQ服务器是如何核对你的身份的?面对庞大的用户群,如何快速找到用户信息

如果用二分法查找:

  • 十亿( )有效用户,所以用二分法查找30次。
  • 十亿( ,也就是需要1T的连续空间。
  • 按有效QQ号大小有序存储:在连续存储空间中,插入和删除一个新的QQ号码将需要移动大量数据

如何快速搜索到需要的关键词呢?如果关键词不方便比较怎么办?

我们看看查找的本质:已知对象找位置

  • 有序安排对象:全序、半序
  • 直接“算出”对象位置:散列

于是我们引进哈希查找法。

哈希查找法的两项基本工作:

  • 计算位置:构造哈希函数确定关键词存储位置;
  • 解决冲突:应用某种策略解决多个关键词位置相同的问题。

时间复杂度几乎是常量:O(1),即查找时间与问题规模无关。

散列的基本思想

  1. 以关键字 为自变量,通过一个确定的函数 (散列函数),计算出对应的函数值 ,作为数据对象的存储地址。
  2. 可能不同的关键字会映射到同一个散列地址上,即 (当

,称为“冲突(Collision)”。——需要某种冲突解决策略

例一

有n = 11个数据对象的集合{ 18,23,11,20,2,7,27,30,42,15,34 }。

哈希表的大小用TableSize = 17,选取哈希函数h如下:

(取余)

因为18 % 17 = 1,所以h(18) = 1

因为23 % 17 = 6,所以h(23) = 6

因为11 % 17 = 11,所以h(11) = 11

......

得到:

地址 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
关键词 34 18 2 20 23 7 42 27 11 30 15

假设新插入35,h(35) = 1,该位置已有对象,冲突!(在后面我们将讨论怎么解决冲突)

查找:

  • key = 22,h(22) = 5,该地址空,不在表中
  • key = 30,h(30) = 13,该地址存放是30,故而找到了。

补充:

装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称 为散列表的装填因子。

例二

将acos、define、float、exp、char、atan、ceil、floor,顺次存入一张散列表中。

散列表设计为一个二维数组Table[26][2],2列分别代表2个槽。

设计散列函数 h(key) = key[ 0 ] - ‘a’ image.png

如果没有溢出,


end



目录
相关文章
|
1天前
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
1天前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
1天前
|
算法 网络协议 Java
我的Java数据结构和算法
我的Java数据结构和算法
7 0
|
1天前
|
算法 搜索推荐
数据结构算法--6 希尔排序和计数排序
**希尔排序**是插入排序的改进版,通过分组插入来提高效率。它逐步减少元素间的间隔(增量序列),每次对每个间隔内的元素进行插入排序,最终增量为1时进行最后一次直接插入排序,实现整体接近有序到完全有序的过程。例如,对数组`5, 7, 4, 6, 3, 1, 2, 9, 8`,先以间隔`d=4`排序,然后`d=2`,最后`d=1`,完成排序。计数排序则适用于0到100的数值,通过统计每个数出现次数,创建对应计数数组,再根据计数重建有序数组,时间复杂度为`O(n)`。
|
3天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
18 6
|
1天前
|
缓存 算法
基于机会网络编码(COPE)的卫星网络路由算法matlab仿真
**摘要:** 该程序实现了一个基于机会网络编码(COPE)的卫星网络路由算法,旨在提升无线网络的传输效率和吞吐量。在MATLAB2022a中测试,结果显示了不同数据流个数下的网络吞吐量。算法通过Dijkstra函数寻找路径,计算编码机会(Nab和Nx),并根据编码机会减少传输次数。当有编码机会时,中间节点执行编码和解码操作,优化传输路径。结果以图表形式展示,显示数据流与吞吐量的关系,并保存为`R0.mat`。COPE算法预测和利用编码机会,适应卫星网络的动态特性,提高数据传输的可靠性和效率。
|
3天前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
8天前
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。
|
8天前
|
机器学习/深度学习 算法
基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型
```markdown 探索烟草香型分类:使用Matlab2022a中的BP神经网络结合小波变换。小波分析揭示香气成分的局部特征,降低维度,PCA等用于特征选择。BP网络随后处理这些特征,以区分浓香、清香和中间香型。 ```
|
11天前
|
算法 调度 决策智能
基于自适应遗传算法的车间调度matlab仿真,可以任意调整工件数和机器数,输出甘特图
这是一个使用MATLAB2022a实现的自适应遗传算法解决车间调度问题的程序,能调整工件数和机器数,输出甘特图和适应度收敛曲线。程序通过编码初始化、适应度函数、遗传操作(选择、交叉、变异)及自适应机制进行优化,目标如最小化完工时间。算法在迭代过程中动态调整参数,以提升搜索效率和全局优化。

热门文章

最新文章