算法是对完成特定问题的程序执行序列描述,表象为从问题初始状态到问题结束状态的所有路径之中寻找可行路径,若无先验经验,根据执行方式不同可以划分为无规则和有规则(启发式)方法。
无规则方法为穷举,改进方法为递推和迭代;有规则方法有分治、贪心、动态规划、分支定界法等。
穷举法:适用于解决极小规模或者复杂度线性增长,而线性规模不会很大的状态。
递推法:利用问题本身的递推关系 先求解递推关系再求解问题的一种方法。一般可解决问题都能得出通项公式或者递推公式。
迭代法:辗转法。不断用变量的新值来代替旧值的过程。其重要的过程为 确定迭代变量 、确定迭代关系式、并对迭代过程进行控制。
一:直接遍历态(穷举法)
程序运行状态是可以别遍历的,遍历算法执行每一个状态,最终会找到一个最优的可行解。
二:分治法
对于输入规模很大的问题,直接求解问题非常困难,可把其N个输入划分成K个不通子集的集合,能够得到K个不通的子问题,并分别求出各个子问题。在得出子问题的解后,还可以找到合适的方法合并问题的解。 过程为 划分——求解子问题(解法一般与原问题相同)——合并。
其算法代表有:快速排序、归并排序、线性时间选择、汉诺塔问题;
大整数乘法、Strassen矩阵乘法、棋盘覆盖、最接近点对问题、循环赛日程表。
斯特拉森乘法:对矩阵运算的改进算法。
把大矩阵分割成小矩阵的方法,T(n)= d(n<=k) | 7t(n/2)+cn^2 (n>k)
分治法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
( 第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;
第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;
第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或者动态规划。
第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。)
思路:实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。
三:贪心法
贪心算法(又称贪婪算法)是指,在对