1、串的定义
串(字符串的简称)是由零个或多个字符组成的有限序列
串中任意个连续的字符组成的子序列称为该串的子串
2、串的表示与实现
类似于线性表的顺序存储结构, 串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。
3.字符串的越界
char str[10];
strcpy(str,"0123456789");
在字符串结尾’\0’已经占用一个字节了
4.KMP算法
KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息(已经匹配的部分中的对称信息),尽量减少模式串(待搜索词)与文本串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,该函数本身包含了模式串的局部匹配信息。其时间复杂度为O(n+m)。
例如此题
在KMP算法中,已知模式串为ADABCADADA,请写出模式串的next数组值?(A)
A. 0,1,1,2,1,1,2,3,4,3
B. 0,1,1,1,2,1,2,3,4,3
C. 2,1,1,2,1,1,2,3,3,4
D. 1,2,3,2,1,1,2,4,4,3
next数组值的解法:
(1)求模式串中,前缀后缀最大的相同长度
A D A B C A D A D A
0 0 1 0 0 1 2 3 2 3
(2)将前缀数组后移一位,并将第一位,置-1
-1 0 0 1 0 0 1 2 3 2
(3)将移位后的数组整体+1
0 1 1 2 1 1 2 3 4 3
5.BF算法
BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果
为了计算出子串位于主串中那个位置之后,所以引入了BF算法,也就是 Brute force算法,其计算效率比较低
for循环的
void BF1(char *s1,char*s2,int position)
{
int len1=strlen(s1);
int len2=strlen(s2);
int i=0,j=0;
for(;j<len1;j++)
{
for(;i<len2;)
{
if(*(s2+i)!=*(s1+j))
i++;
else
{
i++;
if(j==len1-1)
cout<<i-len1<<' ';
break;
}
}
}
}
第二种就是是while循环的
6.三角矩阵的特点
,矩阵的对角线以下的所有元素均为同一常数δδ,或者无效的数据。从上往下逐行的元素总数是比上一行少一个,构成等差数列条件,等差数列数学知识若δδ为常数,则需要在所有元素的最后一个另外加一个元素位置单独存放该数据,对于下三角矩阵有类似的特点,
上三角矩阵的存储
(网上找的图)
下三角矩阵的存储
7.十字链表![在这里插入图片描述](https://img-blog.csdnimg.cn/20191201205447685.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjI3MzYz,size_16,color_FFFFFF,t_70)
8.三元组
将稀疏矩阵中的每个非零元素表示为:
(行号,列号,非零元素值)——三元组
三元组表:将稀疏矩阵的非零元素对应的三元组所构成的集合,按行优先的顺序排列成一个线性表。
存储结构定义:
const int MaxTerm=100;
template
struct SparseMatrix
{
T data[MaxTerm]; //存储非零元素
int mu, nu, tu; //行数,列数,非零元个数
};
9.广义表
1.头尾链表存储表示:链表中有两种结点,表结点和原子结点(数据结点);表结点是表中每个元素在链表中的结点,链表中两个元素或元素相连都通过表结点;
2.扩展性链表表示:表结点存储的节点与头尾相同,但是原子结点(数据结点)多存储一个指向下一个数据的next指针域;
3.针对同一广义表的两种存储表示:
L = (f, (b, e), ((c, d), a))
使用头尾链表存储表示时,最上层存在三个表结点,第一个表结点值域存储一个f,第二个表结点的值域存储一个子表,第三个表结点,存储一个子表,第一个子表再存储一个子表;
使用扩展性链表存储表示时,第一个next指针为f发出指向子表,子表内包好(b, e);括号内的(b, e)next指针由b发出,再出来第三个next指针由子表(b, e)的next指针发出,指向子表(P, a),此处P为(c, d);最后的next指针由P发出指向a