广义表和串
广义表
定义
- 长度:广义表的最高层所含元素的个数
- 深度:广义表括号的最大层数
!空广义表深度为 1
- 表头:广义表的第一个元素
- 表尾:除第一个元素以外,其余所有元素组成的表
运算
- Head( )
- 取表头操作,即取表中第一个元素
- Tail( )
- 取表尾操作,即取表中除了第一个元素之外所有的东西(包括最外层括号)
- 一个非空广义表的表尾可以是原子或子表
!非空广义表的取头运算结果是广义表的第一个元素(原子或子表),而取尾运算结果是广义表去除第一个元素后所剩元素的子表,肯定是广义表
E.G.
- 广义表
A = (a, b, (c, d), (e, (f, g))), 则Head(Tail(Head(Tail(Tail(A)))))的值为 d
性质
- 二维以上的数组其实是一种特殊的广义表。线性表可以看成是广义表的特例,即如果广义表中的每个元素都是原子,则广义表便成为线性表
- 广义表是一种非线性的数据结构,是线性表的一种推广
- 广义表的同级元素具有线性关系
- 广义表的元素可以为空,非空广义表中的元素或者是一个不可分割的原子,或者是一个非空的广义表
- 一个广义表可以为其他广义表所共享
串
模式匹配
传统方法
- 也称作暴力模式匹配算法
- \(m,n\) 分别为主串和字串长度,最坏时间复杂度为 \(O(m,n)\)
KMP算法
- \(m,n\) 分别为主串和字串长度,最坏时间复杂度为 \(O(m+n)\)
手动求next数组
求数组方法
- next数组值为最长相同前后缀长度+1
- 串本身不能作为前后缀
- next[1] = 0(据题目而定)
E.G.
- 已知串s = "ababaaababaa",其next数组值为
解:
| 模式串 | a | b | a | b | a | a | a | b | a | b | a | a |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| next值 | 0 | 1 | 1 | 2 | 3 | 4 | 2 | 2 | 3 | 4 | 5 | 6 |

浙公网安备 33010602011771号