算法分析_运行时间计算的一般法则----C 语言复习
法则 1:FOR 循环
一次 for 循环的运行时间至多是该 for 循环内语句(包括测试)的运行时间乘以迭代的运行时间。
法则 2:嵌套的 for 循环
从里向外分析这些循环。在一组嵌套循环的内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的 for 循环的大小的乘积。
作为一个例子,下面的程序片段为:O(N²):
for(i = 0; i < N; i ++) for(j = 0; j < N; j ++) k ++;
法则 3:顺序语句
将各个语句的运行时间求和即可(这意味着,其中的最大值就是所得的运行时间)。
作为一个例子,下面的程序片段先用去 O(N),再花费 O(N²),总的开销也是 O(N²):
for(i = 0; i < N; i ++) A[i] = 0; for(i = 0; i < N; i ++) for(j = 0; j < N; j ++) A[i] += A[j] + i + j;
法则 4:IF / ELSE 语句
对于程序片段:
if(Condition) S1 else S2
一个 if/else 语句的运行时间从不超过判断再加上 S1 和 S2 中运行时间长者的总的运行时间。
(下面文字摘自资料:)
显然在某些情形下这么估计有些过高,但绝对不会估计过低。其它的法则都是显然的,但是,分析的基本策略是从内部(或最深层部分)向外展开的。如果有函数调用,那么这些调用要首先分析。如果有递归过程,那么存在几种选择。若 递归实际上只是被薄面纱遮住的 for 循环,则分析通常是很简单的。
例如,下面的函数实际上就是一个简单的循环,从而其运行时间为 O(N):
long int Factorial(int N) { if(N <= 1) return 1; else return N * Factorial(N - 1); }
其实这个函数实现的功能就是求 N 的阶乘:N!,可以试着分析一下。
(待续)