数据结构线性表总结
作者:互联网
一.思维导图
二.重要概念的笔记
1.顺序表以及链表
顺序表 | 链表 | |
存储空间 | 预先分配,会造成空间浪费 | 动态分配,不会造成空间浪费 |
存取元素 | 随机存取,按位置访问元素的时间复杂度为O(1) | 顺序存储,按位置访问元素时间复杂度为O(n) |
插入元素 | 需要移动大量元素,时间复杂度为O(n) | 不需要移动大量元素,时间复杂度为O(1) |
适用情况 | 很少进行插入或者删除操作 | 频繁进行插入或者删除操作 |
2.栈和队列
栈:1.后进先出(LIFO)。
2.只能在一端进行插入和删除操作,并且插入需要先判断栈是否满了,删除需要先判断栈是否为空。
队列:1.先进先出(FIFO)。
2.入队只能在队尾,出队只能在队头,同样也是插入需要先判断队列是否满了,删除需要先判断队列是否为空。
三.串
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 |
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]; } }
标签:总结,字符,线性表,nextval,复杂度,值为,next,第二位,数据结构 来源: https://www.cnblogs.com/b12345/p/12587086.html