数据结构(六)—— 散列查找(1):散列表

数据结构系列内容的学习目录 → \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

  1. SymbolTable Initialize Table( int TableSize ):创建一个长度为TableSize的符号表;
  2. Boolean Isln( SymbolTable Table, NameType Name):查找特定的名字Name是否在符号表Table中;
  3. Attribute TypeFind( SymbolTable Table, Name TypeName):获取Table中指定名字Name对应的属性;
  4. SymbolTable Modefy(SymbolTable Table, NameType Name, AttributeType Attr):将Table中指定名字Name的属性修改为Attr;
  5. SymbolTable Insert(SymbolTable Table, NameType Name, AttributeType Attr):向Table中插入一个新名字Name及其属性Attr;
  6. 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(求余)

地址012345678910111213141516
关键词34182202374227113015

  存放: 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。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值