[C/C++语法]—时间复杂度和空间复杂度

我们看算法的好坏主要是从时间,空间两个角度去衡量算法的优劣
时间:就是算法的执行时间
空间:就是算法临时占用的内存大小

时间复杂度

我们通常用大O符号表示法表示时间复杂度,因为每行代码的执行次数之和在同一台计算机上与执行时间成正比,我们先来举个例子

int ans = 0for(int i = 1; i <= n; i++)
{
	ans += i;
}

假设每行代码执行时间相同,该代码的执行次数 1+1+3n+1 = 3(n+1),这个算法的耗时是随着n的变化而变化,因此,我们可以简化的将这个算法的时间复杂度表示为:O(n),为什么可以这样简化呢,因为大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。所以上面的例子中,如果n无限大的时候常数以及倍数意义不大。
常见的时间复杂度有:
时间复杂度不断增大,算法的执行效率越低
在这里插入图片描述

求时间复杂度

⑴ 找出算法中的基本语句;

算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

⑵ 计算基本语句的执行次数的数量级;

只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

⑶ 用大Ο记号表示算法的时间性能。

将基本语句执行次数的数量级放入大Ο记号中。

常数阶O(1)

无论代码执行了多少行,只要没有循环等复杂结构,代码执行行数时确定的数字,那这个代码的时间复杂度就都是O(1),如:

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
m++

线性阶O(n)

一层循环中的代码都为线性阶如上面的例子

int ans = 0for(int i = 1; i <= n; i++)
{
	ans += i;
}

他们的时间复杂度为O(n);

对数阶O(logn)

先看代码

int i = 1;
while(i<n)
{
    i = i * 2;
}

每次循环i都翻倍,i就离n就越来越近,假设x次后i大于等于n,2x >= n 于是 x = log以2为底n的对数
时间复杂度可简写为O(logn)

线性对数阶O(n*logn)

将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}

O(n2) 及 O(n3)

嵌套2层或3层循环

常用算法的时间复杂度

在这里插入图片描述
应注意
在这里插入图片描述

空间复杂度

空间复杂度定义为算法临时占用的内存空间,题目中通常为128MB
当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。
当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);
当一个算法的空间复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;
若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。

发布了20 篇原创文章 · 获赞 2 · 访问量 942

猜你喜欢

转载自blog.csdn.net/zhbbbbbb/article/details/103456136