【时间复杂度】
其实只是一个度量,不是真正的运行时间的投影,真的的运行时间必须上机运行测试才能知道。也就是说只是给了你一个尺子去量一下这个算法的耗时,不是这个算法实现以后真的会耗时多少,也不是两个不同的算法的耗时比例真的可以这么比。时间复杂度的定义是以一个算法基本操作(一般就是循环体)重复执行的次数来作为度量单位。先找出算法的基本操作,然后根据相应的各语句确定它的执行次数。
一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n))。随着模块n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高
首先,我们来看外循环
for(i=0;i<n;i++)
{
....//代码
}
按照i++的递加速度,直到这个循环退出,一共是n次
再来看看内部循环
for(j=1;j<n;j*=2)
{
...//代码
}
这个内部循环的累加速度是j=j*2,假设循环x次之后,这个循环退出
即
2x
>n ==> x>
log2n
具体例子:
1、O(1)
int x = 1;
2、O(n)
for(int i=0; i<n; i++) {
cout<<i;
}
3、O( log2n )
for(int i=1;i<=n;i*=2) {
count++;
}
4、O( n2 )
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
count++;
}
}
5、O(n log2n )
for(int i=1; i<=n; i *= 2) {
for(int j=1; j<=n; j++) {
count++;
}
}
[两条规则]
加取大:
T(n)=
T1
(n)+
T2(n)
=O(f(n))+O(g(n))=O(max(f(n),g(n)))
积相乘:
T(n)=
T1
(n)*
T2(n)
=O(f(n))*O(g(n))=O( (f(n)*g(n)) )
注:时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)
f(n)=a*
n3
+b*
n2
+c*n 则其时间复杂度为O(
n3
)
【空间复杂度】
一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作(一般是指进行删除,排序需要的额外存储空间,可以简单的理解为临时变量占用的存储空间)的工作单元和存储一些为现实计算所需信息的辅助空间。
int x=1, y=2;
int temp = x;
x = y;
y = temp;
//一个临时变量temp,所以空间复杂度为O(1)。