数据结构(六)—— 散列查找(1):散列表
1. 散列表1.1散列表概述1.2散列表的抽象数据类型定义1.3散列的基本思想1. 散列表1.1散列表概述 散列表(Hash table),也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值k
数据结构系列内容的学习目录 → \rightarrow →浙大版数据结构学习系列内容汇总。
1. 散列表
1.1 散列表概述
散列表(Hash table),也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
已知的几种查找方法:1. 顺序查找 O ( N ) O(N) O(N) → 顺序查找算法
2. 二分查找(静态查找) O ( l o g 2 N ) O(log_{2}N) O(log2N) → 二分查找算法
3. 二叉搜索树 O ( h ) O(h) O(h) ,h为二叉查找树的高度 → 数据结构(三)—— 树(5):二叉搜索树
4. 平衡二叉树 O ( l o g 2 N ) O(log_{2}N) O(log2N) → 数据结构(三)—— 树(6):平衡二叉树
问题: 如何快速搜索到需要的关键词?如果关键词不方便比较怎么办?
查找的本质:已知对象找位置。
⋄ 有序安排对象:全序、半序
⋄ 直接“算出”对象位置:散列
散列查找法的两项基本工作:
■ 计算位置:构造散列函数确定关键词存储位置;
■ 解决冲突:应用某种策略解决多个关键词位置相同的问题。
时间复杂度几乎是常量: O ( 1 ) O (1) O(1),即查找时间与问题规模无关!
1.2 散列表的抽象数据类型定义
类型名称: 符号表(SymbolTable)
数据对象集: 符号表是“名字(Name)-属性(Attribute)"对的集合。
操作集: Table ∈ ∈ ∈ SymbolTable,Name ∈ ∈ ∈NameType,Attr ∈ ∈ ∈ Attribute Type
SymbolTable Initialize Table( int TableSize )
:创建一个长度为TableSize的符号表;Boolean Isln( SymbolTable Table, NameType Name)
:查找特定的名字Name是否在符号表Table中;Attribute TypeFind( SymbolTable Table, Name TypeName)
:获取Table中指定名字Name对应的属性;SymbolTable Modefy(SymbolTable Table, NameType Name, AttributeType Attr)
:将Table中指定名字Name的属性修改为Attr;SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr)
:向Table中插入一个新名字Name及其属性Attr;SymbolTable Delete(SymbolTable Table, NameType Name)
:从Table中删除一个名字Name及其属性。
1.3 散列的基本思想
“散列(Hashing)”的基本思想是:
(1)以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
(2)可能不同的关键字会映射到同一个散列地址上,
即 h ( k e y i ) = h ( k e y j ) h(key_{i})= h(key_{j}) h(keyi)=h(keyj)(当 k e y i ≠ k e y j key_{i} ≠ key_{j} keyi=keyj ),称为“冲突(Collision)”。——需要某种冲突解决策略
例: 有n= 11个数据对象的集合{18,23,11,20,2,7,27,30,42,15,34}。符号表的大小用TableSize = 17,选取散列函数h如下:h(key) = key mod TableSize(求余)
地址 | 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 |
存放: h(18)=1,h(23)=6,h(11)=11,h(20)=3,h(2)=2,…如果新插入35,h(35)=1,该位置已有对象!冲突!!
查找: key = 22,h(22)=5,该地址空,不在表中。
key = 30,h(30)=13,该地址存放是30,找到!
装填因子(Loading Factor):设散列表空间大小为m,填入表中元素个数是n,则称α=n/m为散列表的装填因子。
此例中,α=11/17=0.65。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)