算法分析 Analysis of Algorithms

为什么要做性能分析?Why performance analysis?

在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性,可维护性 等等。但是为什么要关心性能呢?

原因很简单,如果有了很好的性能,我们就可以实现以上那些。所以性能相当于货币,有了货币我们就可以购买其他的东西。另外一个原因是研究proformance 非常有趣。

两个算法,到底哪一个好呢?Given two algorithms for a task, how do we find out which one is better?


最笨的办法就是在电脑上实现两个算法,用不同的输入值,看看那个用时短。但是这样的办法有很多问题:

1. 对于有些输入,第一个算法好,但是对于有些输入,第二个算法好、

2. 还有一种可能,第一个算法对于某些输入在某一台机器上性能好,第二种算法在另一台机器上新能好。

渐进分析是一种可以解决以上问题的一种分析办法。在渐进分析中,我们用输入数据的大小来评估算法性能(我们并不会计算出真正的运行时间)。 我们计算的是根据输入的大小,算法的时间或者空间是如何增长的。

举个例子,在一个已排序的数组的查找问题,一种办法是用线性查找(线性增长),一种是用二分查找(binary search)(对数增长) 。为了理解渐进分析是如何解决上面两种问题的,让我们假设线性搜索运行在一台快速的电脑上,二分查找运行在一台较慢的电脑上。对于比较小的输入,快的电脑花的时间更少。但是输入的大小超过了某个值,二分查找绝对会用更少的时间运行完这个算法,即使二分查找运行在较慢的电脑上。原因是二分查找对于输入的大小增长是遵守对数增长的,但是线性查找是遵守线性增长。所以上面两个问题中关于计算机速度的问题,超过某个输入大小时,是可以忽略的。

渐进分析一直有用吗?Does Asymptotic Analysis always work?

渐进分析不是完美的,但是是最好的分析算法的方法。例如,两个排序算法在一台计算机上,一个用时为 100nlogn 另一个是 2nlogn (n 是排序元素的大小) 。两个渐进分析的大小是一样的,都是nlogn, 所以通过渐进分析,我们不能判断哪个算法更好,因为我们忽略了常数。 (即使100000000nlogn 和 nlog 也是一样的)。

还有一点,我们刚才说了超过某个输入的大小,但是也许你的算法的输入永远不会超过这个值,也就是说在渐进分析中慢的算法的性能更好。所以你可能会选择在渐进算法分析中慢的算法用在你的程序中。

原文链接:

http://www.geeksforgeeks.org/analysis-of-algorithms-set-1-asymptotic-analysis/

算法分析 Analysis of Algorithms -------GeekforGeeker 翻译的更多相关文章

  1. 《Mathematical Analysis of Algorithms》中有关“选择第t大的数”的算法分析

    开头废话 这个问题是Donald.E.Knuth在他发表的论文Mathematical Analysis of Algorithms中提到的,这里对他的算法分析过程给出了更详细的解释. 问题描述: 给 ...

  2. "Mathematical Analysis of Algorithms" 阅读心得

    "Mathematical Analysis of Algorithms" 阅读心得 "Mathematical Analysis of Algorithms" ...

  3. 6.046 Design and Analysis of Algorithms

    课程信息 6.046 Design and Analysis of Algorithms

  4. 《Mathematical Analysis of Algorithms》中有关“就地排列”(In Situ Permutation)的算法分析

    问题描述 把数列\((x_1,x_2,\cdots,x_n)\)变换顺序为\((x_{p(1)},x_{p(2)},\cdots,x_{p(n)})\),其中\(p\)是\(A=\{1,2,3,\cd ...

  5. Analysis of Algorithms

    算法分析 Introduction 有各种原因要求我们分析算法,像预测算法性能,比较不同算法优劣等,其中很实际的一条原因是为了避免性能错误,要对自己算法的性能有个概念. 科学方法(scientific ...

  6. 612.1.002 ALGS4 | Analysis of Algorithms

    我们生活在大数的时代 培养数量级的敏感! Tip:见招拆招 作为工程师,你先要能实现出来. 充实基础,没有什么不好意思 哪怕不完美.但是有时候完成比完美更重要. 之后再去想优化 P.S.作者Rober ...

  7. Analysis of algorithms: observation

    例子: 3-Sum 给定N个整数,这里面有多少个三元组,使其三个整数相加为0,如上面的例子为有4个三元组. 这个问题是许多问题如计算机几何,图形学等的基础. 用简单粗暴的方式来解决3-Sum问题 通过 ...

  8. Time complexity analysis of algorithms

    时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少.设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间. 编译时间与实例特征是无关的,且可假设一个编译过的 ...

  9. AlgorithmsI Exercises: Analysis of Algorithms

    Question 1 Suppose that you time a program as a function of N and producethe following table. N seco ...

随机推荐

  1. ASP.NET WebAPI 12 Action的执行

    Action的激活大概可以分为如下两个步骤:Action对应方法的调用,执行结果的协商.在WebAPI中由HttpActionInvoker(System.Web.Http.Controllers)进 ...

  2. ajax提交复杂对象数据

    public class RouteItemManageReq { private List<WorkNodeReq> targetNodes; private RouteItemReq ...

  3. velocity merge作为工具类从web上下文和jar加载模板的两种常见情形

    很多时候,处于各种便利性或折衷或者通用性亦或是限制的原因,会借助于模板生成结果,在此介绍两种使用velocity merge的情形,第一种是和spring mvc一样,将模板放在velocityCon ...

  4. C++ 面向对象的三个特点--继承与封装(一)

    面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下. 概念 继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新 ...

  5. 高清SDI编码器|上海视涛科技

    SDI编码器(E500)简介 SDI编码器(E500)是上海视涛科技出品的高性能SDI编码产品.该SDI编码器是上海视涛电子完全自主研发,并适用于各种SDI信号的编码采集及网络传输的专用硬件设备.可兼 ...

  6. Volley网络连接

    一.Volley a burst or emission of many things or a large amount at once Volley是Android平台上的网络通信库,能使网络通信 ...

  7. HBase读写路径的工作机制

    出处:http://wuyudong.com/1946.html HBase 写路径工作机制 在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的.HBase 接到命令后存下变化信息, ...

  8. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  9. iOS 学习 - 5.UILabel设置行距

    NSMutableAttributedString *arrString =[[NSMutableAttributedString alloc]initWithString:@"asdass ...

  10. CoreAnimation-05-CABasicAnimation

    概述 简介 CABasicAnimation是抽象类CAPropertyAnimation的子类,可以直接使用 CABasicAnimation又称基本动画,从fromValue到toValue按照指 ...