最坏,平均和最佳运行时间(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. 购物车信息存cookie

    //以商品为单位分别存入到各个不同的cookie中,避免因为cookie值过大,导致数据存储失败 $cart_info_one[brand_name] = $parent['brand_name']; ...

  2. 【Effective Java】2、构造参数过多的时候

    package cn.xf.cp.ch02.item2; /** * * 功能:当我们的构造参数有很多,超出可控范围的时候,用build模式 时间:下午8:25:05 文件:NutritionFact ...

  3. .NET Core创建一个控制台(Console)程序

    .NET Core版本:1.0.0-rc2 Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2 开发及运行平台:Window ...

  4. CRUD Operations in MVC4 Using AngularJS and WCF REST Services

    Now in this article I will show how to do Create, Retrieve, Update and Delete (CRUD) operations in M ...

  5. 初学Node(二)package.json文件

    package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...

  6. oracle pfile spfile

    1.参数文件的定义.作用 oracle数据库通过一系列参数来对数据库进行配置.这些参数是以键-值对的形式来表 示的,如:MAXLOGFILES=50BACKGROUND_DUMP_DEST=C:DUM ...

  7. C语言常量与指针

    C语言功能强大而丰富,还表现在const与指针的结合使用上,对不同的问题,它提供不同的保护,特别有用的是指向常量的指针 本文地址:http://www.cnblogs.com/archimedes/p ...

  8. Android Plugin

    工欲善其事,必先利其器.以下介绍一些常用的Android Plugin,有助于开发. 1.adb-idea 支持在AS面板中,执行ADB命令.不过如果用惯命令行的话,可以不安装: 2.android- ...

  9. App开发流程之Xcode配置和本地化

    补充一点遗漏的Xcode配置. 1.偏好设置.Xcode的菜单栏Xcode -> Preference Fonts & Colors可以自定义编码区和控制台的背景.字体. Text Ed ...

  10. 通过注册的URL Scheme向目标APP传递参数

    通过注册的URL Scheme向目标APP传递参数 通过URL Scheme启动APP很简单就可以做到,但有时候我们想在启动APP的时候传递一些参数,这个时候我们就可以通过URL Scheme自定义U ...