数据结构线性表总结
一.思维导图
二.重要概念的笔记
1.顺序表以及链表
顺序表 | 链表 | |
存储空间 | 预先分配,会造成空间浪费 | 动态分配,不会造成空间浪费 |
存取元素 | 随机存取,按位置访问元素的时间复杂度为O(1) | 顺序存储,按位置访问元素时间复杂度为O(n) |
插入元素 | 需要移动大量元素,时间复杂度为O(n) | 不需要移动大量元素,时间复杂度为O(1) |
适用情况 | 很少进行插入或者删除操作 | 频繁进行插入或者删除操作 |
2.栈和队列
栈:1.后进先出(LIFO)。
2.只能在一端进行插入和删除操作,并且插入需要先判断栈是否满了,删除需要先判断栈是否为空。
3.c++头文件定义`#include<stack>`。
队列:1.先进先出(FIFO)。
2.入队只能在队尾,出队只能在队头,同样也是插入需要先判断队列是否满了,删除需要先判断队列是否为空。
3.c++头文件定义`#include<queue>`。
三.串
1.由一个或者多个空格组成的串并不是空串而是空格串。
2.BF算法:将目标串s的第一个字符与模式串t的第一个字符匹配,若相等,继续比较s的第二个字符与t的第二个字符,若不相等,则比较s的第二个字符与t的第一个字符一次比较下去,时间复杂度为O(n*m)。
3.KMP算法:每一趟比较重出现字符不等时,不需要回溯索引指针i,而是利用已经得到的部分匹配的结果将子串向右滑动尽可能远的距离,继续进行比较。它的时间复杂度为O(n+m)。
4.next[j]与nextval[j]:在疑难问题及解决方案中详细介绍。
三.疑难问题及解析方案
一.next[j]:第一位为0,第二位为1,接下去的每位需向前寻找有k个字符与该串的前k个字符相等,则next[j]=k+1,若向前寻找没有字符与该串的前k个字符相等,则next[j]=1;
二.
模式串 | a | b | a | a | b | c | a | c |
next值 | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval值 | 0 | 1 | 0 | 2 | 1 | 3 | 0 | 2 |
1.第一位的nextval值必定为0,第二位如果于第一位相同则为0,如果不同则为1。
2.第三位的next值为1,那么将第三位和第一位进行比较,均为a,相同,则,第三位的nextval值为0。
3.第四位的next值为2,那么将第四位和第二位进行比较,不同,则第四位的nextval值为其next值,为2。
4.第五位的next值为2,那么将第五位和第二位进行比较,相同,第二位的next值为1,则继续将第二位与第一位进行比较,不同,则第五位的nextval值为第二位的next值,为1。
5.第六位的next值为3,那么将第六位和第三位进行比较,不同,则第六位的nextval值为其next值,为3。
6.第七位的next值为1,那么将第七位和第一位进行比较,相同,则第七位的nextval值为0。
7.第八位的next值为2,那么将第八位和第二位进行比较,不同,则第八位的nextval值为其next值,为2。
三.next以及nextval的代码。
void getNext(string p, int next[]) { int j=1, k=0; int len = strlen(p); next[1] = 0; while (j < len - 1) { if (k == 0 || p[j] == p[k]) { j++; k++; next[j] = k; } else k = next[k]; } }
void get_nextval(string T, int* nextval) { int i=1, j=0; len = strlen(T); nextval[1] = 0; while (i < len-1) { if (j == 0 || T[i] == T[j]) { ++i; ++j; if (T[i] != T[j])nextval[i] = j; else nextval[i] = nextval[j]; } else j = nextval[j]; } }