串
只能是字符的线性表
子串
串中取任意字符包括串自身
子串位置
子串在串中第一个字符出现的位置
空格串
" "空格串
""空串
串的操作无非增删查改拼接等等,高级语言中都有相应的函数,即使没有使用线性表中各个函数结合也可以做到,这里就不具体实现了.
串的链式存储常用块链(一块中存几个字符,然后在指向下一块),可以增加密度.
串的模式匹配算法(这个特别常用)
其实就是串中所含子串(模式串)第一次出现的位置(就是查找定位)
BF算法(brute force)就是暴力破解
这个很有意义,暴力破解就是变量寻找变量之间的关系.然后找出匹配和不匹配的情况.但是实际上暴力破解嘛.还是不太可取的.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "asfddsfdsafljlkjglkfdajg";
string str2 = "dsa";
int i = 0, j = 0;
int index = 0;
while (i < str.size() && j < str2.size())
{
if (str[i] == str2[j])
{
i++;
j++;
}
else
{
j = 0;
//i-j 减去原来的位置 +1 向后移动一位 其实无论什么要求都是在i和j这种变量之间寻找关系
i = i - j + 1;
}
}
if (j >= str2.size())
{
//减去子串的长度就是子串在串中的下标.
index = i - str2.size();
}
cout << index << endl; //7
return 0;
}
KMP算法(这个是三个科学家名中各取一个字母)
这个算法真心好难理解,反正我是一直记不住,更是写不出来....
他是根据前缀和后缀来确定j的值,然后i一直向前就可以.
由于这个算法我也不理解,曾经看了没看太懂,写这个的时候又去看了一下,表示还没理解.我选择现在放弃.就不复制粘贴代码了实在没啥意义.
数组
相同类型的元素集合
线性表是特殊的数组也就是一维数组,一个前驱一个后继
二维数组,有两个前驱两个后继,物理上就是行列个一个前驱后继
同理三维数组就是三个等等
数组的操作就是构造,销毁,取值,赋值等等这里我也不进行实现了.
数组的结构是固定的,所以一般不会出现链式结构,同样数组中也一般不会出现插入删除操作.
数组存储公式(这个很重要哦)
loc(0,0) 起始位置(数组首地址)
L 类型大小
二维数组(loc(m,n))
loc(i,j) = loc(0,0) + (i * n + j) * L
三维数组(loc(m,n,p))
loc(i,j,k) = loc(0,0) + (i * n * p + j * p + k) * L
特殊矩阵存储压缩
矩阵常规存储
二维数组
矩阵常规存储特点
可以随机存取,密度为1
不适合常规存储的矩阵
相同元素多,且按照某种规律,0元素多
矩阵压缩存储
相同元素分配一个存储空间,0元素不分配空间
什么样的矩阵可以压缩
一些特殊的矩阵如,对称矩阵,三角矩阵,稀疏矩阵
稀疏矩阵
矩阵中非0元素个数少(%5)
对称矩阵
arr[i][j] == arr[j][i]
存储方法
只存储上(下)三角(包括对角线上的元素),占用 n * (n + 1) / 2 个空间.
一维数组arr[n * (n + 1) / 2]
arr[i][j] = arr[i - 1 + j - 1](具体算法为等差数列)
三角矩阵
对角线上(下)为相同元素,占用 n(n + 1) / 2 + 1 个空间
上三角下标:(i - 1)(2n - i + 2) / 2 + j - i - 1
下三角下标:i(i - 1) / 2 + j
对角矩阵
元素只在对角线(或平行)的区域(几条对角线就是几条对角矩阵)
从上到下存储,对角先以0为下标,上面的为负,下面的为正
稀疏矩阵
三元组
三元组存储是{i,j,arr[i][j]}
也就是二维数组arr[n][3]
首行元素存储三元组的总行数,总列数,总个数
可是三元组不能随机存储
十字链表
方便新元素的插入删除更加灵活
结点除了保存行,列,元素之外还需要两个指针,一个指针指向行下一个非零元素,另一个指针指向列下一个非零元素
行列都需要头指针,也就是两个头指针
广义表
又称列表(lists),线性表是相同类型元素,广义表不一定是相同类型元素.
每个元素可以是单独的一个元素,也可以还是一个广义表(子表)
广义表的灵活度很高,几乎任何数据结构(其实可以说成所有)都可以使用广义表来表示
广义表常规操作是获取表头和表尾.
广义表只能以链式存储
表头
广义表的第一个元素,可以是子表
表尾
广义表中除第一个元素外的子表
元素个数
最外层的元素个数,也就是说如果广义表中存在一个子表,那么它只代表一个元素.
深度
展开广义表,张开几次深度就是几,一个单纯元素(非子表)深度为0
共享
广义表可以共享,广义表A的元素可以是广义表B
递归表
广义表A(a,A) = (a(a,a(a,....)))
这里只是简单介绍,有兴趣的话可以自行查找资料.