绪论一
Programs= Algorithms+Data Structus
算法分析
一个好的算法:运算速度尽可能快,存储空间尽可能少。
算法分析:
a. 正确性;
b. 成本(时间+空间) 时间成本—>基本操作次数
Turning Machine(图灵机模型)
Random Access Machine(RAM)
Big-O-notation
复杂度分析:
a .迭代:技术求和;
b. 递归:递归跟踪+递归方程,猜测+验证。
递归和迭代的区别
递归:函数自己调用自己,相当于自顶向下,减而治之。
使用递归要注意的有两点:
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口。递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解。
递归可以极大简化代码,可读性高,但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。在求解斐波那契数列问题中就能充分体现,当求解超过45项就回变得非常慢。递归过程中多次重复构造已有的实例,造成资源的额外开销。
迭代:利用已有的值不断迭代出新值,相当于自下而上,分而治之。
迭代效率高,没有额外开销,但是不容易理解,不如递归好理解,编写复杂问题困难。
不同级数的复杂度
……
几何级数:
收敛级数:
调和级数:
对数级数:
对于两层循环:
for(i=0;i<n;i++)
for(j=0;j<i;j++){
......
}
复杂度为
将i和j作为横纵座标,复杂度即可视为为矩形面积。(当i或者j的上限变化时,复杂度虽然可视为为三角形面积,但是依然是
时间概念:
例如 :全国人口普查并排序,人口总数
软硬件 | 普通PC机 频率1GHz 运算速度 |
天河一号 1PHz |
---|---|---|
Bubblesort |
||
Mergesort |
上表可以看出算法的不同,在处理大型问题的时候的差距明显。