当前位置: 首页 > 科技观察

算法分析的正确姿势_0

时间:2023-03-19 10:34:20 科技观察

【本系列博文将对常见的数据结构及对应算法进行分析总结,并在每篇博文中提供几道相关的互联网一线企业面试/笔试题,巩固所学知识帮助我们填补空白。项目地址:https://github.com/absfree/Algo。由于个人水平有限,描述中难免有不明确、不准确的地方。希望大家指正,谢谢:)】1.前言在进一步学习数据结构和算法之前,首先要掌握算法分析的一般方法。算法分析主要包括对算法时空复杂度的分析,但有时我们更关心算法的实际性能。另外,算法可视化是一项实用的技能,可以帮助我们理解算法的实际执行过程。当分析一些抽象的东西时,这项技能在使用算法时特别有用。在这篇博文中,我们将首先介绍如何通过设计实验来量化算法的实际运行性能,然后介绍算法时间复杂度的分析方法,同时介绍可以非常方便地预测算法的性能。当然,在文章的最后,我们会做几道一线互联网相关的面试/笔试题,巩固所学,学以致用。二、算法分析的一般方法1、量化算法的实际运行性能在介绍算法的时空复杂度分析方法之前,我们先介绍一下如何量化算法的实际运行性能。这里我们选择衡量算法性能的量化指标是它的实际运行时间。通常这个运行时间与算法要解决的问题的规模有关,比如排序100万个数的时间通常比排序10万个数的时间要长。因此,我们在观察算法的运行时间的同时,还必须考虑它所解决的问题的规模,观察算法的实际运行时间是如何随着问题规模的增加而增加的。这里我们使用算法书(第4版)(豆瓣)中的例子,代码如下:publicclassThreeSum{publicstaticintcount(int[]a){intN=a.length;intcnt=0;for(inti=0;iN0,有|f(n)|N0,则有|f(n)|>c*g(n),则f(n)为Ω(g(n))。第三个称为BigΘ表示法,它确定运行时间的“渐近精确界限”。定义如下:对于f(n)和g(n),如果存在常数c和N0,对于所有n>N0,有|f(n)|=c*g(n),则f(n)称Θ为Θ(g(n))。在我们平时的算法分析中最常用的就是BigOnotation。下面我们将介绍分析算法时间复杂度的具体方法。如果你对大O表示法的概念不是很了解,推荐你阅读这篇文章:http://blog.jobbole.com/55184/。(2)时间复杂度分析方法这部分我们以上述ThreeSum程序为例,介绍算法时间复杂度的分析方法。为了阅读方便,把上面的程序贴在这里:publicstaticintcount(int[]a){intN=a.length;intcnt=0;for(inti=0;i0时递归调用自己,我们要做的是判断if语句在到达递归basecase(即n<=0)之前执行了多少次。我们假设if语句的执行次数为T(n,m,o),则进一步可以得到:T(n,m,o)=T(n-1,m+1,o)+T(n-1,m,o+1)(当n>0时)。我们可以看出basecase与参数m,o无关,所以我们可以进一步将上面的表达式化简为T(n)=2T(n-1),于是可以得到T(n)=2T(n-1)=(2^2)*T(n-2)...所以我们可以得到上述算法的时间复杂度为O(2^n)。【京东】下面程序的时间复杂度为____(wherem>1,e>0)x=m;>y=1;while(x-y>e){x=(x+y)/2;y=m/x;}打印(x);上述算法的关键操作是while语句中的两条赋值语句,我们只需要统计这两条语句的执行次数即可。我们可以看到,当x-y>e时,会执行while语句体中的语句,x=(x+y)/2使得x不断变小(当y<