数据结构—— 散列查找:散列表
Posted 大彤小忆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构—— 散列查找:散列表相关的知识,希望对你有一定的参考价值。
数据结构系列内容的学习目录 → \\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。
以上是关于数据结构—— 散列查找:散列表的主要内容,如果未能解决你的问题,请参考以下文章