原文链接:http://www.nowamagic.net/librarys/veda/detail/2196
如果一个程序运行多次,则有时候它会快点儿,有时候它会慢点儿。算法也一样,在输入1的情况下和输入2的情况下,其执行效率不一定一样。即算法会随着输入数据的不同而有秩序效率的不同,有时候会快点儿,有时候会慢点儿。例如,对一个已经排好序的序列进行排序就要相对容易一些。另外,输入规模的大小也影响算法的运行时间。例如,一个短的序列就比一个很长的序列容易排序。

一般来说,我们希望获得一个算法的时间效率下限,因为所有人都喜欢某种保证:即算法无论如何不会低于我们保证的效率。这种分析就是所谓的最坏情况分析。最坏情况分析指的是在给定输入尺寸的情况下,一个算法运行的效率的下限。

  • 比如早晨上班出门后突然想起来,手机忘记带了,这年头,钥匙、钱包、手机三大件,出门哪样也不能少呀。于是回家找。打开门一看,手机就在门口玄关的台子上,原来是出门穿鞋时忘记拿了。这当然是比较好,基本没花什么时间寻找。可如果不是放在那里,你就得进去到处找,找完客厅找卧室、找完卧室找厨房、找完厨房找卫生间,就是找不到,时间一分一秒的过去,你突然想起来,可以用家里座机打一下手机,听着手机铃声来找呀,真是笨。终于找到了,在床上枕头下面。你再去上班,迟到。见鬼,这一年的全勤奖,就因为找手机给黄了。

找东西有运气好的时候,也有怎么也找不到的情况。但在现实中,通常我们碰到的绝大多数既不是最好的也不是最坏的,所以算下来是平均情况居多。

算法(Algorithms)的复杂度(Complexity)是指运行一个算法所需消耗的资源(时间或者空间)。同一个算法处理不同的输入数据所消耗的资源也可能不同,所以分析一个算法的复杂度时,主要有三种情况可以考虑,最差情况(Worst Case)下的,平均情况(Average Case)的, 最好情况(Best Case)下的。

算法的分析也是类似,我们查找一个有n个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置上待着,那么算法的时间复杂度就是O(n),这是最坏的一种情况了。

最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间。

而平均运行时间也就是从概率的角度看,这个数字在每一个位置的可能性是相同的,所以平均的查找时间为n/2次后发现这个目标元素。平均情况更能反映大多数情况下算法的表现。平均情况分析就是对所有输入尺寸为n的输入,让算法运转一遍,然后取它们的平均值。当然,实际中不可能将所有可能的输入都运行一遍,因此平均情况通常指的是一种数学期望值,而计算数学期望值则需要对输入的分布情况进行假设。

平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。也就是说,我们运行一段程序代码时,是希望看到平均运行时间的。可现实中,平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的。

有时候我们还需要知道最好情况是什么,这有两层意义:一是我们想知道如果运气好,能好到什么程度;二是如果我们能够证明好运气与我们同在,当然需要知道运气好的时候算法表现如何。这种最好分析就是在给定输入规模的时候,看看哪种输入能使算法的运行最有效率。当然,有人认为这种最好情况分析有点假:我们可以操控输入来使一个本来很慢的算法表现得很快,从而达到蒙蔽人的效果。

对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

  • -

我以前问过老师,为什么要分析最坏情况下的算法时间复杂性?结果老师的答案是程序就是要看最差的时间,而且最差时间比较容易计算出来。

嗯,这是个原因。大概还有下面的一些原因:

  1. 最差情况下的复杂度是所有可能的输入数据所消耗的最大资源,如果最差情况下的复杂度符合我们的要求,我们就可以保证所有的情况下都不会有问题。
  2. 某些算法经常遇到最差情况。比如一个查找算法,经常需要查找一个不存在的值。
  3. 也许你觉得平均情况下的复杂度更吸引你,可是平均情况也有几点问题。第一,难计算,多数算法的最差情况下的复杂度要比平均情况下的容易计算的多,第二,有很多算法的平均情况和最差情况的复杂度是一样的. 第三,什么才是真正的平均情况?如果你假设所有可能的输入数据出现的概率是一样的话,也是不合理的。其实多数情况是不一样的。而且输入数据的分布函数很可能是你没法知道。
  4. 考虑最好情况的复杂度更是没有意义。几乎所有的算法你都可以稍微修改一下,以获得很好的最好情况下的复杂度(要看输入数据的结构,可以是O(1))。怎样修改呢? 预先计算好某一输入的答案,在算法的开始部分判断输入,如果符合,给出答案。

算法的最坏情况与最佳情况相关推荐

  1. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  2. 操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)

    操作系统--动态分配 写的时间早了,有些许漏洞和不足,请大家不要介意 分配方式可分为四类:单一连续分配.固定分区分配.动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的 ...

  3. 如何看待 2020 届校招算法岗「爆炸」的情况?

    编辑:忆臻 https://www.zhihu.com/question/342267611 本文仅作为学术分享,如果侵权,会删文处理 如何看待 2020 届校招算法岗「爆炸」的情况? 作者:Ted ...

  4. 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同

    来自:计算机视觉联盟公众号 转载 :知乎问题 如何看待 2020 届校招算法岗「爆炸」的情况? 链接:https://www.zhihu.com/question/342267611 本文仅作为学术交 ...

  5. 最佳适应算法和最坏适应算法_算法:好,坏和丑陋

    最佳适应算法和最坏适应算法 by Evaristo Caraballo 通过Evaristo Caraballo 算法:好,坏和丑陋 (Algorithms: The Good, The Bad an ...

  6. [ 操作系统 ] 假定在单CPU条件下有下列要执行的作业,用一个执行时间图描述在采用非抢占优先级算法时执行这些作业的情况;对于上述算法,各个作业的周转时间是多少?平均周转时间是多少?

    假定在单CPU条件下有下列要执行的作业: 作业 到达时间 运行时间 优先级 1 0 10 2 2 1 4 3 3 2 3 5(高) (1)用一个执行时间图描述在采用非抢占优先级算法时执行这些作业的情况 ...

  7. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理

    湖南师范大学 信息科学与工程学院 操作系统课程实验报告 实验项目名称: 可变分区存储管理 题目 实验一.可变分区存储管理 一.实验目的: 加深对可变分区存储管理的理解: 提高用C语言编制大型系统程序的 ...

  8. 连续分配管理方式的动态分区分配算法(首次适应、最佳适应、最坏适应、邻接适应算法)

    一.动态分区分配算法(连续分配管理方式) 动态分区分配算法:在动态分区分配方式中, 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? (一)首次适应算法 算法思想:每次都从低地址开始查找,找 ...

  9. 3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

    文章目录 0.思维导图 1.首次适应算法 2.最佳适应算法 3.最坏(大)适应算法 4.临近适应算法 5.四种算法归纳比较 0.思维导图 本篇文章是对上一篇文章内存的分配与回收提到的动态分区分配算法的 ...

最新文章

  1. 【Python】functools.wraps定义函数装饰器
  2. Matlab:成功解决 Inner matrix dimension must agree
  3. 【攻防世界003】re-for-50-plz-50
  4. C#学习笔记二(函数高级参数)
  5. 《大道至简》第八章读后感
  6. 怎么解锁blockinput锁定的键盘_“键盘云”--锐角云母公司(Acute angle)又一款矿渣神器...
  7. r语言中v1=c(v1i),1 R语言介绍 | R语言教程
  8. 如何下载m3u8格式视频
  9. P2141 [NOIP2014 普及组] 珠心算测验
  10. 网址 URL 最后的斜杠 / 是作甚的?
  11. 小学计算机应用计划,小学计算机教学计划
  12. CCS导入工程时报错“overlaps the location of another project”解决办法
  13. SQL in 模糊查询的问题
  14. 各类游戏对应的服务端架构
  15. NetWorkx Python API
  16. 谁将成为下一个比尔-盖茨
  17. 怎样把内网IP映射外网
  18. 理财产品信息管理系统(参考答案)
  19. 亚马逊、Lazada、ebay、wish、shopee、速卖通、阿里国际、沃尔玛、newegg、mercari测评自养号,卖家如何选择热门产品?来提高店铺产品的权重?
  20. python培训深圳-深圳Python培训班哪个好

热门文章

  1. 目标检测常见数据增强算法汇总讲解(Mixup,Cutout,CutMix,Mosaic)
  2. 机器学习中,什么是线性和非线性?
  3. ctf-web-秋名山车神
  4. 电商平台-商品表的设计
  5. 当当网高可用架构之道
  6. C语言函数大全--h开头的函数
  7. 学籍管理系统 java_Java学籍管理系统
  8. html加入图片如何自动平铺,css怎么让图片平铺?
  9. 照片动感影集制作软件哪个好?如何快速制作精美、酷炫的效果?
  10. python多线程下载视频_python 实现多线程下载m3u8格式视频并使用fmmpeg合并