第一部分 --- 串的定义

1.主串和子串的关系和集合跟子集之间的关系类似但不相同,主串的子串必须是由主串中连续的字符组成的!!!,真子串是不包含主串本身的所有子串

1.字符位置是:串从左往右,从1开始给字符编号 


第二部分 --- 串的抽象类型定义,存储结构及运算

1.串的逻辑结构是线性结构,而线性结构能够使用的存储结构有顺序存储结构和链式存储结构,于是我们可以得到串的两种形式:1.顺序串;2.链串

1.规定数组中要存储MAX个字符元素时,我们在创建数组的时候并不是直接创建一个具有MAX个元素的数组,而是创建一个能够存储MAX + 1 个字符的数组,此时数组中的下标范围是:

[0] ~ [MAX] ,其中下标为0的元素空着,我们从[ 1 ]开始存储元素

上面这样的创建方式能够方便一些算法的实现。

2.为串创建的数组的类型规定是字符类型(char)

1.为了提高存储密度,我们可以在一个结点中存储多个数据域,此时这样的一个结点被称为块

(存储密度 = 所有数组域占的内存空间之和 / 结构占的总的内存空间)

1.由块组成的链表称为块链(块:chunk)

2.对于串而言用的最多的存储结构是:顺序存储结构


第三部分 --- 串的模式匹配算法

i - j + 2 这个公式的由来:

1. i - j 会回到比较起点的上一个元素,+1 回到比较原点,再+1去到下一次比较的起点

1. t.length 是模式串(子串)的长度,匹配成功后子串在主串中的起点是:

匹配结束点的下标 i - t.length

1.匹配成功后返回的是子串中第一个字符在主串中的序号(下标)

上面这个算法中的第二个if判断里不能够有等号,匹配成功的标志应该是 j > T.length,只有大于了才代表匹配成功了

一般而言,子串的长度都远小于主串,所以我们可以认为这个算法的时间复杂度是 O(n*m)


第四部分 --- KMP算法

1.加快模式串滑动速度的意思是让模式串不用每一次比较都得将自己的指针指回起始元素,然后再开始比较,而是让它根据已经匹配好的结果指向更加合理的位置,然后从这个更加合理的位置开始进行比较,这样就不用每次都笨笨的回到起点然后重新一个个比了

next 数组中存放的是在子串中任意一个位置比较失败的时候时,子串中的指针应该回退到的位置

当我们在子串中比较到第 j 个元素时若比较失败的话,则我们回退到子串中的第 next [ j ] 个元素继续进行比较

这个其实就是在找子串中我们比较失败的第 j 个字符前面那部分的字符串有没有前缀和后缀相等,如果有的话其中最大的前缀的长度是多少(长度就是指前缀的字符个数,由于前缀和后缀相等,所有前后缀的字符个数一样),这个最大的字符个数 + 1后,就是我们想要的K了

(上面的循环条件中小于应该改为小于等于)

1.有了这个next数组KMP算法就能够实现两个最重要的功能了:

一.主串中的比较不需要回退,可以直接从比较失败的位置继续比下去

二.子串中的回退不需要每次都回退到第一个元素,而是根据next数组回退到更合理的位置

nextval数组是对next数组的优化 --- 直接跳过了中间的连续回退过程,直接来到最终回退结果

算法与数据结构 --- 串,数组和广义表 --- 串相关推荐

  1. [数据结构与算法] 串,数组和广义表

    串偏向于算法,数组和广义表偏向于理解 第四章 串.数组和广义表 4.1 串的定义 4.2 案例引入 4.3 串的类型定义,存储结构及运算 4.3.1 **串的类型定义** 4.3.2 串的存储结构 4 ...

  2. Java数据结构和算法:字符串、数组和广义表

    数组和广义表是与前述的线性表有所区别的数据结构.它们可以看成是线性表在下述含义上的扩展:线性表中的元素本身也是一个数据结构 字符串 字符串的定义.存储结构 字符串(string)是由n (n≥0) 个 ...

  3. 数据结构05数组和广义表

    第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构. 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素 ...

  4. 数据结构之数组与广义表

    目录 联系 数组 广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上.从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的. ...

  5. 数据结构:数组和广义表

    数组 数组这部分内容在写<线性表>的的时候介绍过,所以这里就略过一部分内容(略过的内容在这里),写一写前边没写过的. 由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和 ...

  6. C语言数据结构学习——数组和广义表

    数组和广义表 数组 数组定义 特点 常见运算及声明方式 数组的顺序表示和实现 矩阵的压缩存储 概念 稀疏矩阵 对称矩阵 三角矩阵 广义表 数组 数组定义 数组(Array)是有序的元素序列.若将有限个 ...

  7. 六、考研数据结构笔记——数组与广义表

    一.数组的定义 一维数组:就是线性表,前面有 二维数组:准备考研的应该都知道,就是一个矩阵. 数组一旦被定义其,维数(行)和维界(列)就不能改变.只会读取加修改元素. 二.二维数组的按行(列)优先 事 ...

  8. 【数据结构】数组和广义表

    感觉数组这一段没讲什么太多的东西. 先是讲了下定义,就是每个维度上都有对应的前驱后继,首尾元素例外.操作只有初始化 销毁 取元素 修改元素.然后讲了下适合用顺序存储结构,多维情况下根据下标(j1 j2 ...

  9. 数据结构:串、数组和广义表

    串 线性结构:线性表.栈和队列.串与数组和广义表 串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集.在基本操作上,串和线性表有很大差别.线性表的基本操作主要以单个元素作为操作对象,如查 ...

最新文章

  1. [异常笔记] zookeeper集群启动异常: Cannot open channel to 2 at election address ……
  2. ProxylessNAS pytorch
  3. 把转变为json_如何使用7行JSON将您的网站转变为移动应用程序
  4. 记一次线上服务假死排查过程
  5. python 类静态属性_如何从Python中的类中引用静态属性?
  6. eNet 软件发布要求多多
  7. 初探基于GameProtocol和NetFrame的RPG服务器
  8. tkinter Canvas画图片大坑总结
  9. linux源码安装 rpm命令
  10. [转载] Python中字符串的处理方法
  11. android 传输日期,Android 跟日期和时间有关的操作
  12. java jbutton数组_java-JButton需要显示图像数组
  13. python多边形的绘制教程_使用Python matplotlib绘制3D多边形
  14. KK(凯文·凯利) 给年轻人的68条建议
  15. 20121223-命令与征服全面变更
  16. 企业SSH 密钥管理
  17. 《人工智能实践:Tensorflow笔记》听课笔记22_6.1输入手写数字图片输出识别结果
  18. 文件上传漏洞绕过手法
  19. 湛蓝代码自动生成工具有感
  20. 机器人或将人类推向“无能之下的自由”

热门文章

  1. SAP系统PM模块概述-OVERVIEW
  2. 基于PHP的网上鲜花销售系统
  3. Python学习笔记(十一)——第三十讲
  4. android拒绝服务教程,[转帖][转帖]通用型安卓拒绝服务漏洞报告检测工具
  5. 【机器学习|数学基础】Mathematics for Machine Learning系列之矩阵理论(25):幂级数(补充知识)
  6. 搭建论坛如何选择服务器
  7. Java课设对对碰_java课程设计实验报告
  8. ArcGIS之“检查几何”的内涵
  9. php 手机号机主姓名实名验证接口
  10. iOS 全部访问权限设置