爱美容
当前位置: 首页 美容百科

算法时间及空间复杂度分析(几分钟时间让你彻底学会)

时间:2023-07-03 作者: 小编 阅读量: 3 栏目名: 美容百科

几分钟时间让你彻底学会算法在编写成可执行程序的时候,main函数使用这个算法,需要调用一定的空间,消耗一定的时间算法的效率就是通过空间和时间这两个维度来评判的时间复杂度:衡量一个算法的运行速度空间复杂度:衡量一个算法运行需。

算法在编写成可执行程序的时候,main函数使用这个算法,需要调用一定的空间,消耗一定的时间。算法的效率就是通过空间和时间这两个维度来评判的

时间复杂度:衡量一个算法的运行速度

空间复杂度:衡量一个算法运行需要开辟的额外空间

那么我们今天先来看看时间复杂度!

时间复杂度

算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。算法中基本操作的执行次数,为算法的时间复杂度

时间复杂度是一个近似值,并不是实际运行的时间

实际上代码的运行时间,和机器的内存、cpu性能和平台都有关系,同一个代码在不同的机器上运行时间都不一样,如果只以纯粹的时间来考核,很难分析

找到某条基本语句与问题规模N之间的数学表达式,就算出了该算法的时间复杂度

void Test(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;}return;}

请问这个代码中,count语句执行了几次?

F ( N ) = N 22 ∗ N10 F(N)=N^2 2*N 10 F(N)=N2 2∗N 10

N = 10 F(N) = 130

N = 100 F(N) = 10210

N = 1000 F(N) = 1002010

你可能会简单地认为,F(N)的结果就是我们的时间复杂度。其实并不然,我们并不需要一个精确的运行次数,只需要知道程序运行次数的量级就行了

这里我们使用​大O渐进表示法​​来表示时间复杂度(空间复杂度同理)

2.1大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号

推导大O阶方法:

(1)用常数1取代运行时间中的所有加法常数。

(2)在修改后的运行次数函数中,只保留最高阶项。

(3)如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶

使用这种方法后,test1函数的时间复杂度为

O ( N 2 ) O(N^2) O(N2)

对于test1函数,在计算的时候,我们省略了最后的 10,保留了最高阶数N2,即得出了它的时间复杂度

如果最高阶数前面有系数,如2N,系数也将被省略

因为当N的数值很大的时候,后面的那些值对我们总运行次数的影响已经非常小了。大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数

2.2多种情况取最坏

一些算法的时间复杂度会有最好、最坏和平均的情况

最好情况:任意输入规模的最小运行次数(下界)

平均情况:期望的运行次数

最坏情况:任意输入规模的最大运行次数(上界)

举个例子,当我们编写一个在数组中查找数值的算法时,它可能会出现这几种情况:

最好情况:1次就找到

平均情况:N/2次

最坏情况:N次

在实际中的一般情况,我们关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为​​O(N)​​

2.3常见时间复杂度的计算

NO.1

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

这里出现了两个循环,分别是2N次和10次。前面提到了大O渐进法只保留最高阶数并省略系数,所以它的时间复杂度是​​O(N)​​

NO.2

void Func2(int N, int M){int count = 0;for (int k = 0; k < M;k){count;}for (int k = 0; k < N ;k){count;}printf("%d\n", count);}

这里出现了次数为N和M的两层循环:

当M和N差不多大的时候,时间复杂度可以理解为​​O(M)或O(N)​​

当M远远大于N时,时间复杂度为​​O(M)​​

一般情况取O(M N)

NO.3 常数阶

void Func3(int N){int count = 0;for (int k = 0; k < 100;k){count;}printf("%d\n", count);}

这里我们得知了具体的循环次数为100,是一常数,时间复杂度为​​O(1)​​,代表常数阶

只要循环次数已知,为一常数且和所传参数无关,其时间复杂度即为O(1)

NO.4 strchr

//计算strchr的时间复杂度const char * strchr ( const char * str, int character );

看到这道题的时候,你可能会一愣,strchr是什么?

可这里面没有strchr,但有strstr

strstr函数的作用:在字符串1中寻找是否有字符串2

其中第二个str代表的是​​string字符串​​​,那我们是不是可以猜想,chr代表的是​​char字符​​,其作用是在一个字符串中查找是否有一个字符呢?

当然,光是猜想肯定是不够的,我们还需要求证一下

打开​ ​cplusplus网站​​,搜索strchr,即可转到函数定义

可以看到,该函数的作用是定位字符串中第一次出现该字符的位置,返回值是一个​​pointer指针​​

和我们猜想的一样,它的作用就是在字符串中查找一个字符,并返回它第一次出现的位置的地址。

这样一来,strchr函数的时间复杂度就很清楚了,就是遍历字符串所需要的次数,O(N)

NO.5 冒泡排序

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;}}​

​ ​冒泡排序​​是一个非常经典的代码,其思路就是遍历整个数组,如果待排序数字大于它的下一位,则交换这两个数字

N个数字的数组需要N-1次排序才能完成

每一次排序都需要遍历一次数组

这样算来,冒泡排序的循环次数就是两个N,即为O(N2)

能否通过循环层级判断?

细心的你可能会发现,上述代码中出现了两层循环,那是不是可以通过循环层级来判断时间复杂度呢?

并不能!

for(int i=0;i<n;i){for(int j=0;j<3;j)printf("hehe\n");}

如果是上述这种两次循环的情况,会打印3n次呵呵,其时间复杂度是​​O(N)​​而不是N2

我们要准确分析算法的思路,并不能简单地通过循环层级来判断时间复杂度

NO.6 二分查找

int BinarySearch(int* a, int n, int x){assert(a);int begin = 0;int end = n-1;while (begin < end){int mid = begin((end-begin)>>1);//使用位移操作符来模拟/2,防止begin和end相加后超出int范围if (a[mid] < x)begin = mid 1;else if (a[mid] > x) end = mid;else return mid;}return -1;}​

二分查找的思路这里不再赘述

假设我们找了x次,每一次查找都会使查找范围减半

N/2/2/2/2 ……

最后我们可以得出2条公式

2 x = N 2^x=N 2x=N

x = l o g 2 N x=log_2N x=log2N

最好情况:O(1)

最坏情况:O(logN)

通过时间复杂度的对比,我们就能看出二分查找的优势在那里了

可以看到,当数据很大的时候,O(logN)的算法执行次数比O(N)少了特别多!!(来自BT-7274的肯定)

NO.7 计算N!

// 计算阶乘递归Fac的时间复杂度?long long Fac(size_t N){if(0 == N)return 1;return Fac(N-1)*N;}

对于这个阶乘的递归函数而言,每次函数调用是​​O(1)​​,时间复杂度主要看递归次数

对于数字N而言,递归需要N次,时间复杂度是​​O(N)​​

递归算法时间复杂度计算

如果每次函数调用是O(1),看递归次数

每次函数调用不是O(1),那么就看他递归调用中次数的累加

NO.8 斐波那契数列

// 计算斐波那契递归Fib的时间复杂度?long long Fib(size_t N){if(N < 3)return 1;return Fib(N-1)Fib(N-2);}

每次递归,次数都会增加,总的来说是以2^x的量级增加的(x代表行数)

1248… …2 X − 2 1 2 4 8 …… 2^{X-2} 1 2 4 8 …… 2X−2

这里一共有x-1项,用等比数列的求和公式得出,结果为2x-1

所以最后得出的时间复杂度为O(2N)

需要注意的是,当递归调用到底部时,有一些调用会较早退出,这部分位于金字塔的右下角

由于时间复杂度只是一个估算值,这一部分缺失的调用次数对总运行次数的影响不大,故忽略掉

NO.9

void fun(int n) {int i=l;while(i<=n)i=i*2;}

此函数有一个循环,但是循环没有被执行n次,i每次都是2倍进行递增,所以循环只会被执行log2n次

NO.10

给定一个整数sum,从有N个有序元素的数组中寻找元素a,b,使得a b的结果最接近sum,最快的平均时间复杂度是?

A. O(n)//√B. O(n^2)C. O(nlogn)D. O(logn)

数组元素有序,所以a,b两个数可以分别从开始和结尾处开始搜,根据首尾元素的和是否大于sum,决定搜索的移动,整个数组被搜索一遍,就可以得到结果,所以最好时间复杂度为n

-----------------------------------

51CTO丨作者:慕雪年华

为了帮助大家,轻松,高效学习C语言/C,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

对于C/C感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

,
    推荐阅读
  • 听觉的秘密(听觉世界里的潜规则)

    鸡尾酒会效应说起大脑的能力强,至今,大脑在处理声音方面的一个功能还在让所有科学家惊叹,这个功能的神奇机制至今也还是个谜。这种功能有个有趣的名字,叫做“鸡尾酒会效应”。动物也展现鸡尾酒会效应最近的研究发现,很多动物的听觉系统也具有这种鸡尾酒会效应的功能,例如鸟儿们经常群集一起,叽叽喳喳开大会,但它们往往只是回应自己伴侣的叫声,显然它们能够从嘈杂的叽喳声中分辨出伴侣的声音。

  • 淄博环保供热第一供热分公司供暖范围在哪?

    淄博环保供热第一供热分公司供暖范围在哪?供暖小常识之暖气不热的具体排气方法:每个暖气片上都有一个手动排气阀,用户可轻轻拧松手动排气阀,听到排气声立即停止扭动排气阀,若见有稳定水流流出可将排气阀轻轻拧紧。排过气后,若暖气片还是不热,应请专业人员查明原因,帮助解决问题,切不可盲目放水。

  • 窗帘是什么材质 高精密窗帘是什么材质

    透明类的丝质面料,手感柔软、纹路流畅,用做窗帘,既浪漫又高雅。丝质窗帘最大的特点也是最明显的缺点就是价格昂贵,难以清洗。古代太后或皇后临朝听政,殿上用竹帘遮隔,则称为垂帘听政。

  • 普惠性幼儿园能否增加收费项目(普惠性幼儿园覆盖率将超过80)

    普惠性幼儿园覆盖率将超过80日前,陕西省教育厅和陕西省发改委联合印发了《陕西省教育事业发展“十四五”规划》,其中明确提出要强化学前教育规划建设,将新增公办园300所,公办园占比和公办园在园幼儿占比保持50%以上,普惠性幼儿园覆盖。

  • 林清玄人生感言(承担是生命里最美的东西)

    更令人赞叹的是,那个煮面的老板还边与顾客聊着闲天。对于孩子突如其来的谈话,我感到莞尔,并且立即坦然承认,我一定输给卖面的人。他们不用言语,而以动作表达了对生命的承担。在古印度人传统的观念里,认为只要是两条河交会的地方一定是圣地,这是千年智慧累积所得到的结论。当然,在我们以神圣的心面对世界时,自己就有了承担,也就成为值得敬佩的人之一。事实上,所有的比较都是一种执著。

  • 白花蛇舌草的功效与作用(白花蛇舌草的功效与作用效)

    白花蛇舌草一年生小草本,生于潮湿的田边、沟边、路旁和草地。白花蛇舌草药材全体扭成团块,灰绿色至灰棕色。白花蛇舌草补充信息:炮制:取原药材除去杂质,抢水洗净,稍润,切段,干燥。白花蛇舌草适合人群:孕妇慎用白花蛇舌草的功效和作用白花蛇舌草味苦、微甘,性微寒;入肺、肝、胃经;具有清热利湿,解毒抗癌的功效;主治肺热喘咳,咽喉肿痛,湿热黄疸,热淋涩痛,水肿,痢疾肠炎,肠痈,痈肿疮疡,毒蛇咬伤,癌肿。

  • 苏州西站长途汽车站停运通知(苏州市区79班汽车客运班线停班)

    苏州汽车客运总站表示,将给因台风造成停班班次的旅客办理免费退票。昆山客运中心站正密切关注“利奇马”的走向及发展趋势,动态调整班次开行方案并及时通知广大旅客相关停班信息,确保旅客安全出行。有去机场、高铁站、火车站换乘的旅客请适当增加出行时间,以免受台风影响耽误行程。如因天气原因导致班次停运,乘车人可在当天携带本人身份证持车票到车站窗口办理全额退票。

  • 二氧化碳用途(二氧化碳的用途)

    二氧化碳是我们很熟悉的一种气体,大量的二氧化碳会导致温室效应的加剧。学过生物的同学都知道,植物的光合作用是需要二氧化碳作为原料的。在很多农场里面,也会放置产生二氧化碳的仪器,提高农作物的产量。二氧化碳灭火器可用于扑灭图书、重要仪器的失火,因为扑灭后没有任何的残留物质。其实这种效果都是由人为用干冰造成的。以及人工降雨也都会用到二氧化碳等,用途广泛。

  • 桂林社保卡要自己去银行办吗(桂林社保卡要自己去银行办吗现在)

    制卡人1寸白底免冠深色上衣证件纸质彩色照片1张。如委托代办,需提供受委托人的居民身份证原件。填写社会保障卡制卡申领表。社会保障卡启用1.办理条件本统筹区已领取社会保障卡,但未激活社保功能的参保人员。广西区内转入已经持有社会保障卡的参保人员。

  • tvb五花是谁(深扒TVB五朵金花)

    根据港媒报道,杨怡与胡定欣在剧组拍摄期间已经有了两女相争的苗头。根据当时报道,吴卓羲公开表示,自己与徐子珊仅拍摄了一天电视剧,便成为了男女朋友,使得二人被视为最佳荧幕情侣。在此期间,黄宗泽与五花们合作过多部作品,荧幕情侣也是组合了一对又一对。此外,同样家庭事业双丰收的还有勤恳劳模杨怡。然而,现实生活中,与杨怡定情的却是在剧中饰演马国明弟弟的罗仲谦。杨怡仍然认定罗仲谦,并于2016年10月于英国完婚。