算法时空分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法复杂度计算
算法复杂度算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。
时间复杂度(目前复赛测评环境执行1亿次=108)
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
计算方法
1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))
分析:随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f (n)越小,算法的时间复杂度越低,算法的效率越高。
2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=该数量级,若T(n)/f(n)求极限可得到一常数c,则时间复杂度T(n)=O(f(n))
例1:算法:从键盘上读入100个正整数,输出其中最大的数。
Max:=0; 执行1次;
For i:=1 to 100 do
Begin
Read(tmp); 执行100次
If tmp>max then max:=tmp; 最坏为100次
End;
Writeln(max);
合计在最坏情况下为201次。
O(2N+1) O(N)
3.在pascal中比较容易理解,容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(log2n),二分例如快速
幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlog2n)。
例2:n 个元素的选择排序;
Procedure SelectSort(Var R : ArrayType); //对R[1..N]进行直接选择排序
Begin
for I := 1 To N - 1 Do //做N - 1趟选择排序begin
K := I;
For J := I + 1 To N Do //在当前无序区R[I..N]中选最小的元素R[K] Begin
If R[J] < R[K] Then K := J
end;
If K <> I Then //交换R[I]和R[K]
begin
Temp := R[I];
R[I] := R[K];
R[K] := Temp;
end;
end;
End;
时间复杂度:O(n2);n2=108;可以得n最大只能是10000。
分类
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,
k次方阶O(n^k), 指数阶O(2^n) 。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
空间复杂度(目前复赛要求128MB)
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。主程序中定义的全局变量。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。
如在程序中定义了如下全局变量:
f:array[1..1000,1..1000] of longint;
ch:array[1..1000] of string;
d:array[a..1000] of double;
计算占用空间:
F数组:1000*1000*4字节(一个longint占用4个字节)
Ch数组:1000*256字节(一个string占用256个字节)
D数组:1000*8字节(一个double占用8个字节)
所以合计=4264000字节,约为4MB
总结:开静态内存不要超过100MB为妥当。
1、longint:5000*5000,是最大规模;
2、string:390000个,是最大规模;(尽量不要用作为递归参数)
3、int64:1200000个