数据结构 第十章 跳表和散列

本文详细介绍了数据结构中的跳表和散列表,包括它们的时间复杂度和空间复杂度。跳表在理想情况下具有O(log2n)的搜索时间,而散列表在无冲突时操作时间为O(1)。讨论了溢出和冲突解决方法,如线性探查和链式散列。最后,提到了散列表在文本压缩中的应用,例如LZW压缩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典

在这里插入图片描述

  • 采用数据对类型 pair<const K,E>
  • 描述方法:线性表描述、跳表描述、散列描述
  • 字典用顺序表描述,关键字从左到右递增

数组描述的顺序表

  • 搜索:折半 O(log n)
  • 插入: O(n)
  • 删除:O(n)

跳表

在这里插入图片描述
理想情况:

  • i级链表: n / 2 i n/2^i n/2i个数对
  • i-1级数对,属于i级链的概率是1/2
  • 链的级数 [log2n] + 1

构造跳表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除操作,无法控制跳表的结构

复杂度

时间复杂度

  • O(log2 n)

空间复杂度

  • 数据空间:n个数据对
  • 指针:O(n*maxLevel), 每个元素都可能使 ,Maxlevel级,每个元素都需要 MaxLevel+1 个指针

散列表

理想散列

假定散列表的每个位置最多只能放一个数对。

散列表的操作:
在这里插入图片描述
理想情况,没有冲突,直接计算元素位置
时间复杂度都是O(1)

散列函数和散列表

散列函数可以将关键字映射到同一个位置
在这里插入图片描述

  • 好的散列函数,均匀散列函数:映射到同一个桶里的关键字大致相同
  • 除余散列:f(k) = k%D ,当D为素数或者没有小于20的素数因子时,性能最佳。

溢出和冲突

  • 两个不同关键字起始桶号相同时–冲突
  • 同如果可以放多个元素,存储桶中没有空间时,就发生溢出
  • 当每个桶只能存储一个数对时,碰撞溢出就会同时发生

线性探查

当溢出发生的时候,将元素插入下一个可用的桶中,在寻找下一个可用的桶的时候,表被视为环形。

搜索操作:

  • 首先搜索关键字k 为起始桶 f(k)
  • 对表中后继桶进行搜索,直到发生以下情况:
  1. 存有关键字k的桶被找到
  2. 到达一个空桶,搜索失败
  3. 又回到起始桶,搜索失败

删除操作:
不能简单删除搜索到的桶,必须保证之后的搜索过程能正常执行
在这里插入图片描述
时间复杂度 :b 散列表桶的个数
初始化 θ ( b ) \theta(b) θ(b)

最差性能:
插入、搜索时间都为 O ( n ) O(n) O(n) n为表中元素数

平均性能:
在这里插入图片描述

链式散列

在这里插入图片描述

  • 一个桶可以有无数个数对,散列表中的桶都是一个链表

  • 拥有相同起始桶的数对在同一个链表上

  • 插入: 计算起始桶号f(k) 有序链表更有效

  • 查找: 计算起始桶,f(k)

在这里插入图片描述

在这里插入图片描述

应用

文本压缩

LZW 压缩:创建一个字典,字典中粗放的是文本中的字符串与其编码的映射。 字典中的编码,用来代替原始数据中的相应字符串。
在这里插入图片描述
编码为: 0214537
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值