知识大纲

  • 串、数组和广义表
      • 串的顺序存储
      • 串的链式存储
      • 模式匹配算法
        • BF算法
        • KMP算法
    • 数组
      • 特殊矩阵的压缩存储
    • 广义表

串的定义

  • 串的逻辑结构与线性表相似,区别仅在与串的数据对象限定为字符集

  • 串是一种特殊的线性表

  • 串通常以整体作为操作的对象,线性表通常以单个元素作为操作对象

  • 串或字符串:是由零个或多个字符组成的有序序列

  • 串值:双引号括起来的字符序列

  • 子串:一个串中任意个连续的字符组成的子序列(含空串)

  • 真子串:指不包含自身所有子串

  • 主串:包含子串的串相应地称为主串

  • 子串位置:子串第一个字符主串中的位置

  • 空串:零个字符的串

  • 空格串:由空格组成的串

  • 串相等:当且仅当两个串的长度相等并且各个对应位置上的字符相等

串的存储结构

  • 顺序存储

    • 用一组连续的存储单元存储串值的字符序列
    • 串的存储可以用定长一维数组来表示
    • 顺序存储的字符串都是从下标为1的数组分量开始存储下标为0的分量闲置不用
    • 堆式顺序存储:在堆区上动态分配释放字符数组空间
  • 链式存储

    • 使用链式存储结构
    • 数据域为单个字符
    • 块链存储:每个结点可以存放一个或多个字符,称每一个结点,称整个链表块链结构

串的模式匹配算法

  • 子串的定位运算一般称为模式匹配串匹配

  • 著名的两种算法由BFKMP

  • BF算法

    • 用指针i,j指示主串S和子串T中当前待比较的字符位置,i的初值为pos,j的初值为1
    • 如果两个串均未达到串尾,则循环执行以下操作
      • 分别比较指针i,j所指的字符,若相等则指针i,j同时向后移动一位,继续比较
      • 若字符值不相等,则指针后退重新开始匹配,变成i=i-j+2,j=1,然后重新匹配(指针i,j最开始指向下标为1的数组元素,每次回溯时,指针i向后移动一位,指针j回到原点)

模式匹配不一定从主串的第一个位置开始,可以从指定的主串中查找的起始位置pos

  • KMP算法

    • 当第一个位置就出现字符不匹配,子串移动到主串的第二位进行比较
    • 当其他位置出现字符不匹配,寻找公共前后缀
    • 当字符匹配时,子串的比较箭头后移动一位继续比较

让模式串(子串)向右滑动,将前缀的字符串之间移动到后缀字符串的位置,然后让子串的n号位在与主串当前位置进行比较

n=公共前后缀长度+1
只移动子串,让模式串(子串)向右移动,不需要回溯主串指针

数组

数组的定义

  • 数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素

  • 数组是线性表的推广,特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型

  • 一维数组:若线性表中的数据元素为非结构的简单元素则称为一维数组

  • 二维数组:若一维数组中的数据元素又是一维数据结构,则称为二维数组

    • 二维数组的逻辑结构:非线性结构线性结构定长的线性表

数组的顺序存储

  • 一旦规定了其维度各维度的长度,便可以为它分配空间

  • 给出一组下标则可以求相应的数组元素的存储位置

特殊矩阵的压缩存储

  • 矩阵:一个由mxn个元素排成的mn列的表

  • 矩阵的常规存储:将矩阵描述为一个二维数组

  • 矩阵的常规存储特点:

    • 可以对其元素进行随机存取
    • 矩阵的运算非常简单
    • 存储密度为1
  • 不适宜常规存储的矩阵:值相同的元素很多且某种规律分布零元素多

  • 压缩存储:多个值相同的元素只分配一个元素值的存储空间,对零元素不分配空间

  • 能够压缩的矩阵

      1. 对称矩阵(关于主对角线左右元素相同)
      1. 三角矩阵(主对角线一边全为0/常数c)
      1. 对角矩阵(所有非零元素都集中在对角线中心的带状区域中,其他元素全为0)
      1. 稀疏矩阵(非零元素个数少)

广义表

广义表的定义

  • 广义表是线性表的推广,也称为列表

  • 对于线性表而言,存储的数据元素只能是单个元素,而在广义表中,数据元素可以是单个元素,称为原子,也可以是一个广义表,称为子表

  • 广义表的定义是一个递归的定义

  • 表头:非空广义表的第一个元素,可以是单原子,也可以是子表(广义表)

  • 表尾:表头以外的全部元素构成的表,表尾一定是一个广义表

广义表的存储结构

  • 一对确定的表头和表尾可唯一确定广义表

  • 表结点:由标志域,指示表头的指针域,指示表尾的指针域组成

  • 原子结点:由标志域值域组成

  • 标志域:tag,tag=1表示结点为子表,tag=0表示结点为原子

  • 广义表的深度:展开后所含的括号层数

  • 广义表的长度:广义表第一层的元素个数(第一个括号里的元素个数