数据结构老师要求我们每周做一篇数据结构的ppt,这周的ppt题目时时间复杂度。
没办法,老板要我们做,我们就做了,顺便我也能用写ppt的资料写博客。
基本概念
元运算:
为了便于比较同一问题的不同算法,通常从算法中选取一种对于所研究的问题来说是基本运算的元操作(也称基本运算)
算法执行时间大致为基本运算所需的时间与其运算次数(一条语句的运行次数称为语句频度)的乘积。
在一个算法中,执行基本运算的次数越少,其运行时间也就越少;执行基本运算的次数越多,其运算时间也就越多。
也就是说,一个算法的执行时间可以由其中基本运算的执行次数来计量。
时间复杂度公式
T(n) = O(f(n))
记号“O”读作“大O”,它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同
表达式中的f(n)在最后得出的时候需要忽略其低阶项和常系数,这样既可以简化T(n)的计算,又能比较客观地反映出当n很大时算法地时间性能。
例题1
计算下面这个程序的时间复杂度
/*********************************************************
* Author : crazymad
* Last modified : 2016-09-14 21:29
* Filename : main.cpp
* Description :
*********************************************************/
#include <iostream>
using namespace std;
int main(int atgc, char* argv[])
{
int n = 10; // 1
int sum = 0; // 2
for (int i = 0; i < 10; i++) { // 3
for (int j = 0; j < 10; j++) { // 4
sum += i * j; // 5
}
}
cout << sum << endl; // 6
return 0;
}
上边这个简单程序中有6个基本运算操作
int n = 10;
执行1次
int sum = 0;执行1次
for (int i = 0; i < n; i++) {执行n+1次
for (int j = 0; j < n; j++)执行n*(n+1)次
sum += i * j;执行n*n次
cout << sum << endl;执行1次
综合就是:
n+n*(n+1)+3 = n^2+2n+3
忽略低阶项和常数项
最后得出:
最后得出:
T(n)=O(n^2)
例题2
void fun(int a[], int n, int k)
{
int i;
if (k == n-1) {
for (i = 0; i < n; i++)
printf("%d\n", a[i]);
} else {
for (i = k; i < n; i++)
a[i] = a[i] + i * i;
fun(a, n, k+1);
}
}
右边这个简单程序中有6个基本运算操作
int n = 10;
执行1次
int sum = 0;
执行1次
for (int i = 0; i < n; i++) {
执行n+1次
for (int j = 0; j < n; j++) 执行n*(n+1)次
for (int j = 0; j < n; j++) 执行n*(n+1)次
sum += i * j;
执行n*n次
cout << sum << endl;
执行1次
综合就是:
n+n*(n+1)+3 = n^2+2n+3
忽略低阶项和常数项
最后得出:
最后得出:
T(n)=O(n^2)