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

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

哈希查找

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

  • 顺序查找        
  • 二分查找(静态查找)        
  • 二叉搜索树            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月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
65 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
26天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
1月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
51 0
数据结构与算法学习十五:哈希表
|
27天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
1月前
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
18 0
|
12天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
85 9
|
3天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
11 1
|
6天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。