广义表和串

广义表

定义

  • 长度:广义表的最高层所含元素的个数
  • 深度:广义表括号的最大层数

   !空广义表深度为 1

  • 表头:广义表的第一个元素
  • 表尾:除第一个元素以外,其余所有元素组成的表

运算

  1. Head( )
    • 取表头操作,即取表中第一个元素
  2. 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
posted @ 2021-12-23 13:08  絵守辛玥  阅读(222)  评论(0)    收藏  举报