字典
- 采用数据对类型 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)
- 对表中后继桶进行搜索,直到发生以下情况:
- 存有关键字k的桶被找到
- 到达一个空桶,搜索失败
- 又回到起始桶,搜索失败
删除操作:
不能简单删除搜索到的桶,必须保证之后的搜索过程能正常执行
时间复杂度 :b 散列表桶的个数
初始化
θ
(
b
)
\theta(b)
θ(b)
最差性能:
插入、搜索时间都为
O
(
n
)
O(n)
O(n) n为表中元素数
平均性能:
链式散列
-
一个桶可以有无数个数对,散列表中的桶都是一个链表
-
拥有相同起始桶的数对在同一个链表上
-
插入: 计算起始桶号f(k) 有序链表更有效
-
查找: 计算起始桶,f(k)
应用
文本压缩
LZW 压缩:创建一个字典,字典中粗放的是文本中的字符串与其编码的映射。 字典中的编码,用来代替原始数据中的相应字符串。
编码为: 0214537