一、线性结构
栈:
字符串:
子串;字符串中任一连续的片段,称为子串
平凡子串:
非平凡子串:非空且不同于原串
KMP模式next数组计算:
①前1、前2两个字符的next 值为0、1;
②后面求解每一位的next值时,根据前一位进行比较(前一位的值与next对应的值相比较)
③if 相等,则next=前一位的Next + 1;
if 不相等, 则持续回溯前一位Next 的Next,都不相等,则为1,否则对应的Next + 1
参照:KMP算法中的next数组求解_kmp算法求next-CSDN博客
数组:
arr[1...M, 1...N],元素大小K, 首地址:Base
求arr[i, j]地址:
按行存储:base+((i-1)*N +j-1 )*K
按列存储:base+( (j-1)*M + i-1) *k
链表:
需要存储节点之间的指向的指针,
循环队列:
长度:(rear - front +m) %m,其中M为容量, 尾指针为:(front + size -1 + m) %m
头指针:(rear - len +1 +m) %m
图:
无向图:任意两个定点之间的边是无向边(Vi,Vj)。注意括号
有向图:从顶点Vi到Vj的边有向<Vi,Vj>,任意2顶点的边有向
完全图:有向完全图和无向完全图,任意两个顶点都存在边则称为无向完全图,任意两个顶点存在互为相反的弧则称为有向完全图
连通图:在无向图中,从顶点Vi到Vj有路径,则称为连通。任意顶点Vi到Vj都有路径,则称为连通图
强连通图:在有向图中,任意顶点Vi到Vj同时Vj到Vi有路径,则称为强连通图
图的存储:
邻接矩阵:N*N 的二维数组。时间复杂度n^2
邻接表:一维数组+链表。时间复杂度:顶点数+边数(n+e)
树:
二叉排序树:与父节点对比,小的为左子树,大的为右子树。
树顺序存储下标:
父节点下标值i,左子树2*i,右子树2*i+1
树的节点数:高度h, 则最多有2^h -1个节点,h层最多有2^(h-1)
树的种类:
完全二叉树:只有最大层的右边可能缺少节点,其他层都不缺少节点
平衡二叉树:左右子树高度差不超过1,同时左右子树都是平衡二叉树
最优二叉树:即哈夫曼树:
满二叉树:每层节点都存在,没有缺少的节点
哈夫曼树:根据提供的数值,每次根据两个最小的数值,构造一颗新的二叉树,根节点值为左右子树和,然后删除左右子树,根点加入二叉树中。
排序算法:
插入排序:
归并排序:
冒泡排序:
二分排序:
快排:
堆排序:
选择排序:
设计策略:
①分治:通常将复杂的分解为简单的,多个简单的合并为一个。一般使用递归。主要使用场景:二分法,快排
②贪心:总是选择当前最优,而不考虑整体是否最优。
③动态规划:
④回溯: