算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译
最坏,平均和最佳运行时间(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 翻译的更多相关文章
- 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复 ...
- Chapter4 复杂度分析(下):浅析最好,最坏,平均,均摊时间复杂度
四个复杂度分析: 1:最好情况时间复杂度(best case time complexity) 2:最坏情况时间复杂度(worst case time complexity) 3:平均情况时间复杂度( ...
- linux系统平均负载高(load average)
系统平均负载高(load average) 问题现象 两个案例都是:系统平均负载高,但cpu,内存,磁盘io都正常 什么是系统平均负载 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进 ...
- 冒泡排序最佳情况的时间复杂度,为什么是O(n)
冒泡排序最佳情况的时间复杂度,为什么是O(n) 我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第 ...
- KM算法(二分图的最佳完美匹配)
KM算法大概过程: (1)初始化Lx数组为该boy的一条权值最大的出边.初始化Ly数组为 0. (2)对于每个boy,用DFS为其找到一个girl对象,顺路记录下S和T集,并更新每个girl的slac ...
- 查看FPM在你的机子上的平均内存占用情况
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n" ...
- KDD 2011 最佳工业论文中机器学习的实践方法-翻译
作者:黄永刚 Practical machine learning tricks from the KDD 2011 best industry paper 原文链接:http://blog.davi ...
- MapReduce 模式、算法和用例(MapReduce Patterns, Algorithms, and Use Cases)
在新文章“MapReduce模式.算法和用例”中,Ilya Katsov提供了一个系统化的综述,阐述了能够应用MapReduce框架解决的问题. 文章开始描述了一个非常简单的.作为通用的并行计算框架的 ...
- Java 中常见排序算法
经典的排序算法总结 冒泡排序算法 算法描述: 比较相邻的元素:如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针 ...
随机推荐
- ex_KMP--Theme Section
题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110060#problem/B Description It's time f ...
- mysql命令行备份数据库
MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:pass 数据库名称:myweb 备份数据库到D盘跟目录 mysq ...
- CSS属性选择器温故-4
1.属性选择器就是通过元素属性来找到元素 2.属性选择器语法 CSS3遵循了惯用的编码规则,通配符的使用提高了样式表的书写效率,也使CSS3的属性选择器更符合编码习惯 3.浏览器兼容性 CSS选择器总 ...
- 怎样让js循环重复执行过程
setInterval(function(){ cc();},60000);setInterval是每隔一分钟就执行一次方法体,主要特点是循环不断的执行.而setTimeout是执行一次就不会继续执行 ...
- jQuery源码分析-02正则表达式-RegExp-常用正则表达式
2.4 常用正则表达式在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正. 常用的数字正则(严格匹配) 正则 含义 ^[1-9]\d*$ 匹配正整数 ^-[1 ...
- 【转】Android中处理崩溃异常
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...
- iOS之Cookie
iOS之Cookie使用 简介 概念:Cookie中文名称叫做"小型文本文件",指某些网站为了辨别用户身份而存储在用户本地终端上的数据(通常经过加 密). Web服务器可以用过Se ...
- 【读书笔记】iOS-类别
一,类别是一种为现有的类添加新方法的方式. 二,类别的局限性. 1,无法向类中添加新的实例变量.类别没有位置容纳实例变量. 2,名称冲突,即类别中的方法与现有的方法重名.当发生名称冲突时,类别具有更高 ...
- OC数组排序
NSArray *array = @[@"tailong", @"kaersasi", @"airuiliya", @"yingl ...
- 【转】self.myOutlet=nil、viewDidUnload、dealloc的本质剖析
对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大,设计再漂亮,如果内存控制不好,也难逃程序莫名退出的噩运,这与网页开发是完全不同的. 内存控制里面有很多门道,在这里分析一下 ...