基本算法主要分为以下四类:
1、子结构类算法:分治法,动态规划,贪心法
子结构问题主要是要知道怎么从子结构问题的解推出现在问题的解,最粗糙的是简单递归,在递归的基础上进行改进就形成了分治、动态规划和贪心。
分治法着重于从中间开始考虑
动态规划着重从头尾考虑得到子结构,着重考虑从子结构推出现有结构,需要记录子结构值。动态规划本质上只是减少了在递归过程中对子结构问题的重复求解,但是并没有缩小子结构问题的求解空间,所以有一些问题使用动态规划通常时间复杂度并没有减少到最小,这些问题通常需要更加巧妙的解法来实现最优的时间复杂度。
贪心法着重于从整体开始考虑,找出最优值后得到子结构
2、搜索类算法:回溯法,分支限界法, 深度优先搜索 ,广度优先搜索
搜索类算法最粗糙的是暴力枚举。主要需要明确是否能有序穷举解空间。
回溯法建立在深度优先搜索的基础上;
分支限界法建立在广度优先的基础上(分支限界维护一个优先队列,按照广度优先扩展并计算优先值,然后放入优先队列中并选出最优点作为下一个扩展点)。 Dijkstra算法最好归结为分支限界,每次从队列中选择最短路径的最小值进行扩展。
3、排序类算法:
冒泡、插入、选择
快排、归并、堆、希尔
计数、基数、桶
4、查找类算法:
遍历查找、二分查找
索引查找、哈希表