最坏,平均和最佳运行时间(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. ViewPager和Fragment的组合使用

    如图是效果图用的是Viewpager和fragment来实现的主界面 不过其中的预加载我没有解决 如下是代码代码比较简单 package com.ithello.dingding; import ja ...

  2. Scala underscore的用途

    _ 的用途 // import all import scala.io._ // import all, but hide Codec import scala.io.{Codec => _, ...

  3. mongodb学习6--js操作mongodb

    一,mongo知识储备:1. 获取mongoDB中数据库的大小命令use databasenamedb.stats()显示信息如下 > db.stats() { "collection ...

  4. linux下mysql忘记root密码解决方法

    如果使用 MySQL 数据库忘记了root账号密码,可以通过调节配置文件,跳过密码的方式登数据库, 在数据库里面修改账号密码,一般默认的账号是 root 1.编辑 MySQL 配置文件 my.cnf ...

  5. Python 学习笔记1

    1.Python2.x与3​​.x版本区别 2.常量与变量 3.if  elif  else 4.注释 5.用户交互 6.字符串拼接 7.文件扩展名 8.缩进 9.运算符 10.while循环 Pyt ...

  6. 怎样在win7系统配置数据源

    1.点击桌面的我Windows 图标,找打控制面板 2.进入控制面板主页,选择系统和安全,进入系统和安全 3.进入系统和安全主页后选择管理工具,点击进入 4.进入管理工具后,选择数据源,进行数据源的配 ...

  7. webpack打包

    (1) 首先生成一个package.json文件 进入项目文件的根目录执行npm init 在根目录中生成一个package.json文件 (2)全局安装webpack  执行npm install ...

  8. CSS3选择器(一)

    E[att^='val'] 选择属性值以val开头的任何字符 E[att$='val'] 选择属性值以val结尾的任何字符 E[att*='val'] 选择属性值包含val的任何字符 :root HT ...

  9. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

  10. Servlet API遍程常用接口和类

    本文主要总结Servlet  API遍程常用接口和类 Servlet API http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html ...