Chapter 1 - Algorithm Analysis(a)
定义
注意
补充、解释
其他
1 Algorithm Analysis
1.1 Definition
In addition,all algorithms must satisfy the following criteria:
There are zero or more quantities that are externally supplied.
At least one quantity is produced.
Each instruction is clear and unambiguous.
算法在有限步骤后会结束
每个指令要足够基础,原则上,一个人用纸和笔就能执行,每个指令要是可行的(feasible)
程序是用编程语言写成的,而且不一定是有限步后结束的,比如操作系统
算法可以用自然语言、流程图、伪代码等描述
1.2 What to Analyze
程序的运行时间可能和运行的机器或编译器有关,我们主要分析time and space complexities(machine & compiler-independent)
- Instructions are executed sequentially.
- Each instruction is simple,and takes exactly one time unit.
- Integer size is fixed and we have infinite memory.
我们通常考虑平均时间复杂度或最坏情况下的时间复杂度,这里的最坏情况是指最坏的输入下,程序的时间复杂度是多少
1 | void add(int a[][MAX],int b[][MAX],int c[][MAX],int rows,int cols) |
一共执行了多少次语句,就是时间复杂度
1 | float rsum(float list[],int n) |
每个rsum都有2次,直到第二个参数为0,共2n+2次,如n=2,2次(其实是先判断一次,然后进到rsum(1),rsum(1)返回结果后有个return那才是第二次)到rsum(1),再2次到rsum(0),rsum(0)又有2次
1.3 Asymptotic(渐进的) Notation
我们数一共执行了多少次语句,其实是想预测当n增长时,运行时间会如何增长,以此来比较两个程序的时间复杂度
例如一个程序执行n^2次,另一个程序执行n+3次,当n=1,2时看上去第二个程序执行的次数更多,但对于足够大的n,第二个程序的执行次数更少,运行时间更短
如果存在正数c和n,使得当N>n时,
那么
如果存在正数c和n,使得当N>n时,
那么
如果
当我们说一个程序的时间复杂度是
1.3.1 Rules of Astmptotic Notation
如果
如果
当比较两个程序的时间复杂度时,我们认为N是无限大的
1 | void add(int a[][MAX],int b[][MAX],int c[][MAX],int rows,int cols) |
for循环的运行时间至多是循环内部的语句的运行时间乘循环次数
嵌套for循环:所以循环的循环次数相乘,再乘最里面的语句的运行时间
1 | for(int i = 0;i<n;++i) |
条件语句的运行时间不超过判断的运行时间加上各种情况里最长的运行时间
1.3.2 Recursion
1 | long int Fib(int n) |
时间复杂度和空间复杂度是多少?
时间复杂度
令
那么
(用高中学习的数列递推方法)斐波那契数列通项是
那么
递归算法的空间复杂度等于递归树的最大深度
例如计算F(4)
- 调用F(4),入栈,深度为1
- F(4)需要先算F(3),入栈,深度=2
- F(3)需要先算F(2),入栈,深度=3
- F(2)需要先算F(1),入栈,深度=4
- F(1)返回1,出栈,深度=3
- F(2)接着调用F(0),入栈,深度=4
…
对于F(N),最长的一条调用路径是F(N)->F(N-1)->…->F(1)
路径长度为N,故空间复杂度为
1.3.3 Master Theorem
我们考虑这样一种递归算法的时间复杂度
当子问题规模降到1时,即
1 | int BS(int arr[],int left,int right,int x) |
最后可以得到
对于主定理,假设
若
若一样大,即
1.4 Exercise
最后来一道练习,求下面两个程序的时间复杂度
有点难,答案也许会在下一篇文章公布
1 | //程序1 |
Hint
当比较两个程序的时间复杂度时,我们认为N是无限大的
- Title: Chapter 1 - Algorithm Analysis(a)
- Author: Hare Fuyukawa
- Created at : 2026-03-07 14:48:16
- Updated at : 2026-03-25 18:22:25
- Link: https://redefine.ohevan.com/Data-Structure/DS/FDS-1/
- License: This work is licensed under CC BY-NC-SA 4.0.