数据结构学习笔记(绪论一)

来源:互联网 发布:linux signal 处理 编辑:程序博客网 时间:2024/04/28 13:03

绪论一

Programs= Algorithms+Data Structus

算法分析

一个好的算法:运算速度尽可能快,存储空间尽可能少。
算法分析:
a. 正确性;
b. 成本(时间+空间) 时间成本—>基本操作次数

Turning Machine(图灵机模型)
Random Access Machine(RAM)

Big-O-notation

复杂度分析:

a .迭代:技术求和;
b. 递归:递归跟踪+递归方程,猜测+验证。


递归和迭代的区别
递归:函数自己调用自己,相当于自顶向下,减而治之。

使用递归要注意的有两点:
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口。

递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解。

递归可以极大简化代码,可读性高,但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。在求解斐波那契数列问题中就能充分体现,当求解超过45项就回变得非常慢。递归过程中多次重复构造已有的实例,造成资源的额外开销。

迭代:利用已有的值不断迭代出新值,相当于自下而上,分而治之。
迭代效率高,没有额外开销,但是不容易理解,不如递归好理解,编写复杂问题困难。


不同级数的复杂度

T(n)=1+2+3+...+n=O(n2)
T2(n)=12+22+32+...+n2=O(n3)
T3(n)=13+23+33+...+n3=O(n4)
……
几何级数:Ta(n)=a0+a1+a2+a3+...+an=O(an) 复杂度与末项同阶。
收敛级数:T(n)=O(1)
调和级数:T(n)=1+1/2+1/3+1/4+...+1/n=O(logn)
对数级数:T(n)=log1+log2+log3+...+log(n)=log(n!)=O(nlogn)

对于两层循环:

for(i=0;i<n;i++)    for(j=0;j<i;j++){        ......    }

复杂度为O(n2)
将i和j作为横纵坐标,复杂度即可视为为矩形面积。(当i或者j的上限变化时,复杂度虽然可视为为三角形面积,但是依然是O(n2))。

时间概念:
1105sec
113109sec
1010sec
1501081021sec

例如 :全国人口普查并排序,人口总数 n109,在不同硬件和软件条件下估算比较计算时间。

软硬件 普通PC机 频率1GHz 运算速度 109flops 天河一号 1PHz 1015flops Bubblesort (109)2=1018 109sec30 103sec20 Mergesort 109log(109)=30109 30sec 0.03ms

上表可以看出算法的不同,在处理大型问题的时候的差距明显。

0 0