时间复杂度
在进行算法分析时候,我们先分析出这个程序它语句总的执行次数T(n),然后用O来描述T(n)所对应的数量级,代表算法时间复杂度
栈和队列
栈:先进后出,括号匹配,递归
队列:先进先出,层次遍历,解决主机与外设速度不匹配的问题
图
图的存储结构 | 邻接矩阵 | 邻接表 | 十字链表 邻接多重表 |
---|---|---|---|
图的遍历 | 广度优先搜索 | 深度优先搜索 | |
最小生成树 | 普利姆 适用于点少 | 克鲁斯卡尔 适用于边少 | |
最短路径 | 迪杰斯特拉 单源最短路径 | 佛洛依德 各顶点之间最短路径 |
介绍常见的排序
直接插入排序:稳定,将数组中的所有元素依次跟已排序的元素队列中的元素进行比较,如果目标元素比某个已排序的元素小,则直接插入到已排序的元素队列中,直到全部元素都插入进去。
希尔排序:不稳定,把数组中的所有元素按照一定的增量进行分组,对每组进行直接插入排序,随着增量一轮轮减少,最终恰好被分为一组,即可完成排序
冒泡排序:稳定,两两比较相邻的关键字,如果反序则交换,依次向后比较,直到这一趟没有反序的记录为止。
快速排序:不稳定,一趟排序要将整体分割成独立的两部分,一部分记录的关键字均比另一部分记录的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序
简单选择排序:不稳定,第i趟要从整体未排序记录中选择最小的记录,再与第i个记录进行交换
堆排序:不稳定,构造一个大根堆,把堆顶和最后一个元素交换,完成一趟排序之后重新构造大根堆重复这个过程完成为止
归并排序:稳定,对于一个整体分割为独立的两部分,再对单独的每一部分再一次分割,分割到不能再分割之后两两交换,开始进行归并,最终得到一个完整有序的整体
基数排序:稳定,从个位到十位到百位的顺序,依次排序
怎么改进冒泡排序
在循环体外边设置一个flag标志位,一旦发现某一趟没有进行交换,说明排序已经完成,没必要继续进行下一趟了,提前完成循环。
贪心算法,分治,动态规划
贪心算法:在对问题求解时,不从整体最优上加以考虑,总是做出局部最优解
分治法:将原问题分解成若干子问题,再把子问题的解合并(相互独立的),形成原问题的解,比如归并排序
动态规划:将原问题分解成若干子问题,再把子问题的解合并(相互重叠的),形成原问题的解,强调全局最优解
动态规划两要素
子问题重叠性,最优子结构性质
递归的精髓
递归就是再函数体中调用函数本身。
精髓是确定重复的逻辑,控制逻辑的边界,进行恰当的退出。
回溯的特点
在搜寻问题的解时候,发现不满足求解条件,就返回寻求其他的路径