提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
一、串
(一)串的定义和实现
1.串的定义
相关概念:
(1)串是由零个或多个字符组成的有限序列;
(2)串中任意多个连续的字符组成的序列是该串的子串;包含子串的串称为主串;
(3)某个字符在串中的序号称为该字符在串中的位置;
(4)子串在主串中的位置以子串的第1个字符在主串中的位置来表示;
(5)当两个串的长度相等且每个对应位置的字符都相等时,称这两个串是相等的。
(6)由一个或多个空格(空格是特殊字符)组成的串称为空格串,空格串不是空串,长度为串中空 格字符的个数。
2.串的存储结构
(1)定长的存储结构
所谓定长的存储结构就是利用字符数组来存字符串;
//串的存储结构
#define maxsize 100
typedef struct{
char ch[maxsize];
int length;
}SString;
(2)动态分配
typedef struct{
char *ch;
int length;
}HString;
(3)链式存储
类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构。
3.串的基本操作
(二)串的模式匹配算法
1.简单模式匹配算法
(1)算法思想
将主串中长度与模式串长度相等的子串依次与模式串比较,直到找到一个匹配的子串,或者所有的子串都不匹配。
(2)代码
//简单的模式匹配算法
int Index(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(S.ch[i]==T.ch[j]){
++i,++j;
}
else{
i=i-j+2;
j=1;
}
}
if(j>T.length){
return i-T.length;
}
else{
return 0;
}
}
(3)效率分析
空间效率分析:只用到了常数级的辅助空间,空间复杂度为O(n)
时间效率分析:最坏情况下,也就是模式串与子串没有匹配,在这种情况下时间复杂度O(nm),其中n,m分别是主串和模式串的长度。
最好情况下,也就是第一个子串就与模式串匹配,即时间复杂度为O(n)其中n为模式串的长度
2.KMP算法
关于KMP算法,只要掌握了如何求next数组就不会有太大问题,这里首先要会模拟KMP算法的执行过程,初学者需要注意的是:对于第n个元素匹配失败时,主串指针不变,模式串指针j变为xx,j每次变为什么取决于模式串,也就是说模式串不同,j的变化也就不同,这里j的变化不存在什么规律
图中第一行表示模式串的第几个元素,第二行是元素对应的 j 的值。这里值得注意的是任何模式串的next[1]都是0,next[2]都是1。408中对于KMP算法掌握手动推理过程即可
KMP算法的时间复杂度:O(m+n),其中求next数组时间复杂度O(m),匹配过程中最坏时间复杂度O(n)。因此KMP算法的时间复杂度为O(m+n)。
3.KMP算法的优化
核心在于求nextval数组,注意nextval[1]永远都是0;
二、数组和特殊矩阵
(一)数组
存储结构
一维数组:
二维数组:
行下标:[0,h1],列下标[0,h2]
行优先:
列优先:
(二)特殊矩阵的压缩存储
1.对称矩阵
对称矩阵:若n阶方阵中任意一个元素都有a(i,j)= a(j,i) 则该矩阵为对称矩阵
压缩存储:只存储主对角线+下三角区,或者只存储主对角线和上三角区
按照行优先的方式将矩阵存储在一个一维数组中,数组下标与元素之间的对应关系如下
列优先存储
推导过程:
2.三角矩阵
三角矩阵的压缩存储与对称矩阵基本上很相似,不同之处在于多了一个存储常量的位置
3.三对角矩阵
三对角矩阵,也称带状矩阵
压缩存储:只存储带状区域
行优先:
前 i-1行共3(i-1)-1个元素
a(i,j)是第 i 行的 j-i+2个元素
所以a(i,j)是第2i+j-2个元素
反过来,第k=1个元素,在第几行第几列
前i-1行共 3(i-1)-1个元素
前i行共 3i-1 个元素
显然,3(i-1)-1<k+1s 3i-1
解不等式 得:
4.稀疏矩阵
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。