最坏,平均和最佳运行时间(Worst, Average and Best Cases)

在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐进分析法来分析算法的性能。

我们从三个方面分析算法:

1.最坏情况

2.平均情况

3.最佳情况

这是一段很简单的线性查找的代码 从arr[] 中查找x

// Linearly search x in arr[].  If x is present then return the index,
// otherwise return -1
int search(int arr[], int n, int x)
{
int i;
for (i=; i<n; i++)
{
if (arr[i] == x)
return i;
}
return -;
} /* Driver program to test above functions*/
int main()
{
int arr[] = {, , , };
int x = ;
int n = sizeof(arr)/sizeof(arr[]);
printf("%d is present at index %d", x, search(arr, n, x)); getchar();
return ;
}

 最坏情况分析(通常都是可以完成的)Worst Case Analysis (Usually Done)

在最坏运行时间分析中,我们计算运行时间的上界限。这种最坏情况下,一定会运行最大的操作数量(maximum number of operations)在线性搜索中,最坏的情况时发生在x不在array[]中,所以search()会用x和所有在array[]中的元素比较,所以最坏时间复杂度是O(n);

平均情况分析 ( 有时可以完成)Average Case Analysis (Sometimes done) 

在平均情况分析中,我们计算所有可能的输入的运行时间,把所有的时间加起来除以数量,我们必须知道这些情况的分布。在线性搜索算法下,我们假设所有的情况是平均分布的(包括x不在array[]的情况.(在一个有n个数的数组里 x的位置有n+1种情况)

average case time =  =  = O(n)

最佳情况分析Best Case Analysis (Bogus) 

在最佳情况分析中,我们计算运行时间的下界限,算法用最少的操作就可以完成,在线性搜索中,最佳的情况是x的位置就是第一个,所以说总的操作次数是固定的,不取决于n的大小。所以在最佳情况下时间复杂度是O(1)。

在大多数情况下,我们用最差情况来分析算法,我们可以保证运行时间的上界限,这对于算法来说是一个好的信息。

对于平均情况的分析,对于很多具体的例子不是很容易分析。因为我们必须知道输入的分布情况。

而对于最佳情况的分析就不是很好了,保证下界限并不能提供任何信息尤其是在最坏的情况下,有可能你的算法要运行很久甚至一年。

对于一些算法,这三种情况的渐进分析都是一样的,例如没有最坏,最佳的情况。例如归并排序,所有的情况的时间复杂度都是O(nlogn) 。而对于其他大多数排序算法都有最坏情况和最佳情况,例如基本的快速排序(选择基准的时候pivot 选最左或最右的元素)。那么最坏情况就是输入的数组已经是排序好的,最好的情况就是数组总是能分成两个大小一样的子数组。对于插入排序,最坏的情况就是输入数组是逆序,最好的情况是输入数组是已排序的。

原文链接:

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

翻译:

Rui

算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译的更多相关文章

  1. 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)

    我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复 ...

  2. Chapter4 复杂度分析(下):浅析最好,最坏,平均,均摊时间复杂度

    四个复杂度分析: 1:最好情况时间复杂度(best case time complexity) 2:最坏情况时间复杂度(worst case time complexity) 3:平均情况时间复杂度( ...

  3. linux系统平均负载高(load average)

    系统平均负载高(load average) 问题现象 两个案例都是:系统平均负载高,但cpu,内存,磁盘io都正常 什么是系统平均负载 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进 ...

  4. 冒泡排序最佳情况的时间复杂度,为什么是O(n)

    冒泡排序最佳情况的时间复杂度,为什么是O(n) 我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第 ...

  5. KM算法(二分图的最佳完美匹配)

    KM算法大概过程: (1)初始化Lx数组为该boy的一条权值最大的出边.初始化Ly数组为 0. (2)对于每个boy,用DFS为其找到一个girl对象,顺路记录下S和T集,并更新每个girl的slac ...

  6. 查看FPM在你的机子上的平均内存占用情况

    ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n" ...

  7. KDD 2011 最佳工业论文中机器学习的实践方法-翻译

    作者:黄永刚 Practical machine learning tricks from the KDD 2011 best industry paper 原文链接:http://blog.davi ...

  8. MapReduce 模式、算法和用例(MapReduce Patterns, Algorithms, and Use Cases)

    在新文章“MapReduce模式.算法和用例”中,Ilya Katsov提供了一个系统化的综述,阐述了能够应用MapReduce框架解决的问题. 文章开始描述了一个非常简单的.作为通用的并行计算框架的 ...

  9. Java 中常见排序算法

    经典的排序算法总结 冒泡排序算法 算法描述: 比较相邻的元素:如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针 ...

随机推荐

  1. HDU 2577---How to Type

    HDU  2577 Description Pirates have finished developing the typing software. He called Cathy to test ...

  2. JDK动态代理的实现及原理

    Proxy.newProxyInstance(classloader,Class,invocationHandler) 调用getProxyClass0(loader, interfaces)生成代理 ...

  3. 环境搭建二 secureCRT配置

    上一篇里面讲到了虚拟机安装,以及secureCRT的远程连接.此篇文章介绍secureCRT的配置. 颜色设置 参考   http://jingyan.baidu.com/article/a681b0 ...

  4. java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue

    在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://do ...

  5. SharePoint 自定义WebPart之间的连接

    1.创建SharePoint解决方案,添加两个WebPart分别用来发送和接收: 2.发送值的WebPart需要继承自IWebPartField(当然,根据需要还可以选择IWebPartField,I ...

  6. teambition的热血团队

    一群热血年轻人开发了一套项目协作软件teambition,无意帮他们宣传,更多见网址www.teambition.com. 网站上简短的一段话,深深的打动了我.他们说teambition: 由热爱工作 ...

  7. 在Android开发中使用Ant 三:批量打包

    批量打包最常用到的地方是进行产品推广时,为每个渠道打一个包.上一篇随笔中,介绍了怎样进行一次完整的打包,批量打包只要在此基础上做一次循环即可. 在打包之前要做两个准备工作,一个是读取渠道,一个是修改存 ...

  8. iOS设计模式之代理模式

    代理模式 基本理解 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式的应用 远程代理:就是为一个对象在不同的地址空间提供据不代表.这样可以隐藏一个对象存在于不同地址空间 ...

  9. 单例模式(oc)

    //主函数 main.m #import <Foundation/Foundation.h> #import "Singleton.h" int main(int ar ...

  10. IT技术很好的视频网址

    1.华为工程师 带你实战C++ 2.vimoe,国外的,需要FQ哦.https://vimeo.com/85831438