时间复杂度与空间复杂度

news/2024/10/22 16:36:57/

时间复杂度

概念
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。 一个算法执行所耗费的时间理论上来说是算不出来的,因为它不仅仅与你写的算法有关,还与运行这个算法的机器也有关系,如果你的机器很好,那么你所耗费的时间就可能会更少,所以,一个算法耗费的时间是需要放在机器上实际测验才能知道的,但是我们总不能每个算法都拿来上机测试,来记录该算法的时间,所以我们就有了时间复杂度这样的分析方式。
一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

大O的线性表示法
大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
我们来计算一下下面代码的时间复杂度
 

void Func1(int N) 
{int count = 0;for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k) {++count;}int M = 10;while (M--) {++count;}printf("%d\n", count);
}

这个函数在调用的过程中使用了三个for循环和一个while循环,每循环一次我们说它进行了一次基本操作。那么这个函数执行基本操作的次数为F(N)=N²+2*N+10
那么我们如何用大O的线性表示法来表示这个函数的时间复杂度呢?

推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

按照上面的规则,那么上述代码的时间复杂度就为O(N²)。
我们发现,通过上面的规则,我们就使用N²来代替了N²+2*N+10,我们为什么要这样规定呢,我们以上面的表达式为例,当N为不同的值时,表达式的结果为多少

N=100 F(N)=10210
N=1000 F(N)=1002010
N=10000 F(N)=100020010

我们发现,当N不断变大时,表达式的值也不断变大,而对表达式的结果影响最大的一项就是这个表达式中阶数最高的那一项。

那我们为什么只保留对结果影响最大的那一项呢?我们知道时间复杂度描述的对象是一个算法,而不是某一次的运算,那么当我们使用这个算法并向里面传入一个能够影响算法基本操作执行次数的变量时,我们并不能确定我们输入的N的值是多少,N就有可能是任何值,当N比较小时,也许别的项与最高阶项的结果差距并没有那么大,但是当N的值越来越大时,最高阶项的值与其他项的值的差距也就越来越大了,我们还是以上面的代码为例,当我们的N在不断的变大时,因为其余项对结果的影响相对来说比较小,那么我们就可以忽略他们对结果的影响,只保留对结果影响最大的那一项来表示我们的时间复杂度。

那么为什么我们要用1来表示所以的常数呢,这是因为计算机的运行速度是非常快的,每秒可能就可以执行上亿此的运算,那么常数次的执行次数与我们计算机的运算速度相比,可能与执行一次的运行速度相差不会太大,所以我们就使用1来代替所有的常数项,那么只有循环次数为常数的算法的时间复杂度相应的就是O(1)。

去掉与最高阶项相乘的常数的原因也是因为对结果影响最大的是这个最高阶项,而不是这个最高阶项前面的系数,所以也要把它去掉。
 

空间复杂度

空间复杂度的定义
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

空间复杂度举例
冒泡排序的空间复杂度?

void BubbleSort(int* a, int n) 
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

还是刚刚冒泡排序的代码,我们刚刚计算了它的时间复杂度,现在再来看一下它的空间复杂度,根据定义我们知道,空间复杂度是用来估算占用空间的大小的,那么我们就可以根据算法中创建的变量的个数来表示算法的空间复杂度,这个冒泡排序算法创建了3个变量,根据大O的渐进表示法的规则,该算法的空间复杂度就为O(1)。
 

参考文章:

什么是时间复杂度与空间复杂度_时间复杂度和空间复杂度的概念_c铁柱同学的博客-CSDN博客

时间复杂度和空间复杂度(详解版)

最详细的解说—时间和空间复杂度 - 简书


http://www.ppmy.cn/news/439585.html

相关文章

骁龙8Gen2什么水平 骁龙8Gen2怎么样

骁龙8 Gen2将由台积电代工&#xff0c;采用4nm制程工艺打造&#xff0c;CPU将由超大核&#xff0c;大核以及高能效核组成&#xff0c;而超大核可能是ARM Cortex X系列。 骁龙8 Gen2怎么样这些点很重要 http://www.adiannao.cn/7 而且骁龙8 Gen2将会采用“1223”的全新架构方案&…

为什么骁龙8+Gen1的口碑比骁龙8Gen1的口碑好?

现在国内的手机市场内卷相当严重&#xff0c;并且国内的手机厂商都和高通骁龙有合作&#xff0c;而高通骁龙最近推出的骁龙8Gen 1 &#xff0c;也是人们一直讨论的焦点&#xff0c;性能也是非常的强悍&#xff0c;但是骁龙8Gen1的口碑比骁龙8Gen1的口碑好太多了&#xff0c;这是…

高通骁龙8 Gen2参数性能怎么样 相当于苹果什么处理器

高通骁龙8Gen2将会继续采用台积电4nm工艺&#xff0c;CPU为八核心设计&#xff0c;分别为1个X3大核、2个A720中核、2个A710中核以及3个A510小核&#xff0c;GPU为Adreno740&#xff0c;相比骁龙8Gen1来说在CPU架构设计上有了较大变化&#xff0c;从134三簇架构变成了1223四簇架…

小米网络信号测试软件,【小米5X评测】高通:骁龙625移动平台Modem及信号是亮点_手机评测-中关村在线...

高通&#xff1a;骁龙625移动平台Modem及信号是亮点 骁龙移动平台高跑分&#xff1f;如果你一直这样认为那就错了&#xff1a;高运算性能只是它真正实力的冰山一角。举个例子&#xff0c;你或许不知道&#xff0c;高速高效的网络连接也是骁龙移动平台能够提供的另一层面体验&am…

高通新处理器骁龙450曝光 性能不输给骁龙625

最近高通公司旗下的骁龙6XX和骁龙8XX表现很抢眼&#xff0c;骁龙660和骁龙835在高端市场表现不错&#xff0c;得到手机厂商的追捧&#xff0c;但低端型号却不尽如人意&#xff0c;反而没有竞争对手联发科的表现好。实际上高通还是准备了新产品来应对这种情况的。 根据爆料&…

ChatGPT函数调用初体验:让ChatGPT具备抓取网页文本的能力

OpenAI在6月13号升级了ChatGPT&#xff0c;推出了类似其网页版插件的功能——函数调用&#xff08;Function calling&#xff09;&#xff0c;13号当天我在很多微信公众号就看到了这个消息&#xff0c;甚至有人将函数调用称为杀手级特性&#xff0c;正好周末有空&#xff0c;就…

2023-06-17:说一说redis中渐进式rehash?

2023-06-17&#xff1a;说一说redis中渐进式rehash&#xff1f; 答案2023-06-17&#xff1a; 在Redis中&#xff0c;如果哈希表的数组一直保持不变&#xff0c;就会增加哈希冲突的可能性&#xff0c;从而降低检索效率。为了解决这个问题&#xff0c;Redis会对数组进行扩容&am…

Kibana安装(Linux)

Kibana安装&#xff08;Linux&#xff09; 概述安装kibana 概述 Kibana 是一款多用于 Elasticsearch的 数据可视化开源工具。 在使用时&#xff0c;最好与ES版本同步&#xff0c;这里接着上一节&#xff0c;使用 kibana-7.14.0 安装kibana 下载解压 tar -zxvf kibana-7.14.…