1.时间复杂度问题:
事后分析法
事前分析法:
大O表示法:O(1),O(n),O(logn),O(n^2)一般分为常数级,线性级,对数级,平方级。
其中:O(logn)举例
int number=1;
while(number<n){
number=number*2;
//时间复杂度为O(1)的算法
...
}
递归算法时间复杂度分析方法---迭代法
迭代法的步骤是:先将递归算法简化成对应的递归方程,然后反复迭代,将递归方程的右端变换成一个级数,最后进行级数求和,估计和的渐进和。
例子:
抽象的考虑以下递归方程,且假设n=2^k,则迭戴求解的过程如下:
T(n)=2T(n/2)+2
=2(T(n/2^2)+2)+2
.......
O(n)
2.递归设计要点:递归算法设计的关键在于找出递归关系和递归终止条件。
经典汉诺塔问题
有三个基座A,B,C,开始的时候A基座上面放着从大到小n个盘子,先需要接住B盘,将其转移到C盘上面,且过程中需要保持盘子从大到小放置,每次只能移动一个盘子。
先看2阶(终止条件)的汉诺塔问题
A(1,2) B() C()
A(2) B(1 ) C()
A()B(1)C(2)
A() B() C(1,2)
再来考虑n阶(递归关系)的汉诺塔问题
A(n-1,n) B() C()
A(n)B(n-1) C()
A( ) B(n-1) C(n)
A() B() C(n-1,n)
第一步:hanoi(n-1,a,b,c) 先将a盘n-1个盘子借助c盘移到b盘
第二步:把下面的一个盘子从A盘上面移到c盘;
第三步:hanoi(n-1,b,c,a) 将b盘的n-1盘借助a盘移到c盘
3.分治法
如折半查找,合并排序,快排,二叉树遍历
快排思想回顾:
如数组a[n],一般选择a[n/2]的值作为中值,将比其小的数放在左边的一个数组中,比其大的数放在右边的数组中,之后依次循环。
归并排序思想回顾:
将这些元素集合分为更多的集合,分别排序后,归并成一个集合。
棋盘覆盖问题
大整数的乘法(两个n位大整数相乘)
4.贪心法
最短路径问题,最小生成树问题等。