怎样计算一个算法的复杂度?

分析一个算法主要看这个算法的执行需要多少机器资源。在各种机器资源中,时间和空间是两个最主要的方面。因此,在进行算法分析时,人们最关心的就是运行算法所要花费的时间和算法中使用的各种数据所占用的空间资源。算法所花费的时间通常称为时间复杂度,使用的空间资源称为空间复杂度。接下来学习如何计算一个算法的时间复杂度和空间复杂度。

1.时间复杂度

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,然后分析T(n)随n的变化。

怎样计算一个算法的复杂度?

这样用大写的O来标记算法的时间复杂度,称之为大O(Order的简写)标记法。一般随着n的增长,T(n)也会随之增长,其中T(n)增长最慢者就是时间性能最优的算法。

在计算时间复杂度的时候,根据T(n)与n的最高阶数关系,我们给这些算法的复杂度进行了归类,如表1所示。

怎样计算一个算法的复杂度?

当然还会有一些其他阶数关系,这里只是列出了几种较常见的关系。算法的执行次数可能会与规模n呈现出这些关系,那么这些关系又是如何推导出来的呢?下面给出大O阶的推导方法:

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

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

(3)如果最高阶项存在,且不是1,则除去其常系数,得到的结果就是大O阶。

接下来通过分析几段程序的执行过程来推导出其时间复杂度,程序段1代码如下所示:

int a=100;              //执行一次int b=200;              //执行一次int sum=a+b;            //执行一次printf("&d\\n",sum);      //执行一次

上述程序段有4行代码,每一行执行1次,加起来一共执行了4次,f(n)=4,即T(n)=O(4)。根据推导方法中的第一条,将常数项以1代替。在保留其最高阶项时,发现其没有最高阶项,因此该算法的时间复杂度为O(1),为常数阶。程序段2代码如下所示:

void func(){    int i,sum=0;                         //执行一次    for (i=0;i<=100;i++)    {    sum +=i;                              //执行n次    }    printf("sd\\n",sum);               //执行一次}

该程序段的执行次数为1+n+1,则f(n)=n+2,即T(n)=O(n+2)。然后将常数项以1替换,且只保留最高阶项,则得出T(n)=O(n),因此该算法的时间复杂度为O(n),为线性阶。

程序段3代码如下所示:

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

在这个程序段中,当i<n时,循环结束。如果循环了f(n)次,则2(fn)=n,即f(n)=log2n,T(n)=O(log2n)。然后消除常系数,保留最高阶项,最后得出T(n)=O(logn),为对数阶。

用大O阶来推导算法的复杂度并不难,读者在以后的学习中设计算法,就可以用此法来估测算法的优劣。

2.空间复杂度

空间复杂度是对一个算法在运行过程中所占存储空间大小的度量,一般也作为问题规模n的函数,以数量级形式给出,格式如下所示:

怎样计算一个算法的复杂度?

一个算法的存储量包括输入数据所占空间、程序本身所占空间和辅助变量所占空间。在对算法进行分析时,只考虑辅助变量所占空间。若所需辅助空间相对于输入数据量来说是常数,则称此算法为原地工作。若所用空间量依赖于特定的输入,则除了有特殊说明外,均按最坏情况考虑。

有时候,在写代码时可以用空间来换取时间,例如,写一个算法来判断某年是否是闰年,这样每输入一个年份都要调用算法去判断一下,在时间上就有点复杂。为了提高效率,可以用空间来换取时间,即建立一个大小合适的数据,编号从0到n,如果是闰年,则存入数据1,否则存入数据0。这样只要通过判断年份编号上存储的是0还是1就知道该年份是否是闰年了。

用空间换取时间可以将运算最小化,但这两种情况哪种更好,要结合具体情况而定。一般情况下,都是用时间复杂度来度量算法,当不加限定地使用“复杂度”这一术语时,都是指时间复杂度。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/367018.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年8月29日 16:02
下一篇 2023年8月29日 16:13

相关推荐

  • 360关键词排名规则是神马?

    360关键词排名规则是什么?如何提高360关键词排名?相信有不少的朋友都会有这样的疑问,接下来就让我们一起看看下面的这一篇文章,在这篇文章中,我们将会为大家详细介绍360关键词排名规则的相关内容。 一、目前360搜…

    2022年5月22日
    0524
  • 小编分享百度算法越来越多SEO优化要怎么玩。

    相隔一个多月,百度相继推出闪电算法和惊雷算法,越来越多的算法推出,对于绝大多数seo优化从业者来说无异于晴天霹雳,SEO优化要怎么玩下去?接下来杭州seo优化公司小编将为大家分享相关内容。每次百度新的算法一出…

    2023年6月26日
    00
  • 谷歌与百度的seo区别在哪。

    网站优化企业在平时中常常会碰到某些要做谷歌优化的,很多网站优化的初学者会感觉谷歌优化和网站优化是同样的,各抒已见,但并不是意味着方法不适合管不了做网站优化,仍是做谷歌提升,网站优化方法大部分是同样的…

    2022年10月28日
    021
  • 石榴算法的名称由来,有什么影响呢?

    现在是网络发展时代,很多关于网络流通下的产物都会有一定的打击手段,其中石榴算法就是百度针对低质量网站的进一步打击的升级版。我们对此有什么样的了解呢? 石榴算法简介 2013年5月17日下午,百度网页搜索反作弊…

    2022年5月21日
    0335
  • 我来分享2019年的SEO优化有什么变化。

    2019年的SEO优化有什么变化?时至今日虽然是移动互联网时代,但互联网营销中SEO优化作用并没有降低多少。作为重视官网的企业来说,2019年SEO优化到底要怎么做? 一、关于搜索引擎算法的相关问题 包括百度在内的搜索…

    2022年10月31日
    020
  • 教你SEO网站优化之2022年12月百度新算法分析。

     seo网站优化之2022年12月百度最新算法分析大家好,我是杭州网站制作小编SEO网站优化-李栋,今天就和大家一起分享一下2022年最新的百度算法走势。百度总是在变化中逐步完善自身,更加有利于用户体验,为用户提供最…

    2023年6月18日
    01
  • 我来分享为什么SEO优化人员要懂搜索引擎算法。

    为什么SEO优化人员要懂搜索引擎算法? SEO是一个神奇的职业,每个从业人员都希望探其究竟,试图更好的掌握搜索引擎原理,而整日每天热衷于到各个角落谈论搜索引擎算法,期望整理出一套自己的seo优化算法。 实际上,…

    2022年11月14日
    00
  • 我来分享SEO摆脱不了实际社会中的规则。

    SEO摆脱不了实际社会中的规则! 通常做seo网站优化的盆友肯定碰到过这种状况老板或者客户无论你如何解释都嫌你的速度慢之后用竞价等方式与你进行比较,这种情况下我们会觉得十分的蛋疼,那麼今天呢就该大家正式的解…

    2022年11月14日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息