O()算法表示分析

原创 2013年12月05日 19:54:53

               前阵子有同学跟我讨论,怎么这个问题用递归方法(O(n^2))比非递归方法(O(n)解决时间还快?按照算法复杂度来看,前者比后者慢啊,这怎么解释?

               其实,算法复杂度O()的表示方法是参考很多因素的,不能因为一两个例子而决定。

               首先,一个算法的好坏,我们肯定不能做最好情况的打算,比如任何一种搜索算法,假如第一个元素就是我们要搜索的元素,那不管何种搜索算法,时间似乎都差不多快,没什么多大的比较意义。

               那么,算法的性能就当然用最坏情况来比较(也有平均情况下考虑的,但这个平均比较模糊)。例如,要搜索的元素,在数据库中压根就没有,这是最坏情况了吧。这时候,算法的性能就可能有点显露出来了,为什么说有点呢?因为就像前面一开始的例子,O(n^2)与O(n)的算法复杂度,在实际情况中并不完全是这样的。

               先来说说O()表示方法,O表示一个函数的上限,也就是假设n变得无穷大的时候,来考察算法的性能。相信高中的时候,大家都知道,函数的求导,也就是函数值y的增长率,是会随着x的值不断变化的。比如,y1=x^2,y2=5*x,这两个函数,当x=2的时候,y1=4 < y2=10,当x=5的时候,y1=y2=25,当x>5的时候,将会永远存在y1>y2。这就是增长率的问题。O()表示方法也是这样的,只是把n考虑到无穷大的时候,常数可以忽略,比如一开始我同学问我的问题里面,后者非递归算法,可能不是O(n),而是O(10*n),只是n无穷大的时候,10简直是打酱油的,忽略不计(所以写成O(n))。所以说,不能在某一个程序中确定n值的时候,拿O()复杂度来说事。比如,具体的程序中,n=5的话,O(n^2)当然比O(10*n)来得快,这也是解决了前面我的同学的困扰。

               精确衡量算法是很难的,因为算法里面,包括语句运行,包括数据处理,包括空间复杂,很多因素。所以,采用什么算法,不能只根据O()表示法来确定,假如A算法特点:语句执行快,数据空间复杂。B算法特点:语句执行慢,数据空间简单。那如果一个程序里面是需要很少数据的,当然就采取A算法,因为程序的数据少,更加符合这个算法的特性。

               所以,采用什么算法,具体分析各种因素而定。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++抽象编程——算法分析(2)——Big-O表示法

进行如果我们按照上一篇的文章那样的详细分析的问题是您最终得到的信息太多。 虽然有一个公式来预测一个程序将要花多长时间,但是通常可以采取更多的定性措施。 本质上,选择排序的问题在于,将输入向量的大小加倍...
  • redRnt
  • redRnt
  • 2017年05月11日 18:58
  • 766

算法的时间复杂度(大O表示法)

定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂...
  • wantken
  • wantken
  • 2014年06月17日 14:49
  • 480

字符串最小表示法 O(n)算法

转载自:字符串最小表示法 O(n)算法 网上看了这篇文章后还是感觉有些地方讲的没有详细的证明所以添加了一点 红色字是博主写的 求字符串的循环最小表示:   上面说的两个字符串同构的,并没有直接先求...

设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。

/* 将L中的元素,按如下规则插入新表,并返回新表。 (1,2)->(1,3,2)->(1,3,4,2)->(1,3,5,4,2)->(1,3,5,6,4,2)->... */ DuLinkList ...

Linux Anticipatory (预测)I/O 调度算法分析笔记

as_add_request是调度算法的入口。AS和Deadline比较类似,都是先把request加入sector 排序的红黑树,然后再把requst加入fifo。只不过AS因为加入了预测,需要在加...

算法分析之有重复元素的排列问题O(n!)

#include #include #include using namespace std; template void quicksort(vector& a, int left, int ri...

linux deadline I/O调度算法分析笔记

deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点:(1)请求超时时,对超时请求的选择。(2)没有请求超时时,当扫描完电梯最后一个request后,准备返回时,...

建堆的算法复杂度分析 O(n)

代码: template inline void MaxHeap::make_heap(vector & v) { if (heap_.size() != 0) heap_.clear(); ...
  • mitkook
  • mitkook
  • 2012年10月11日 05:18
  • 6158

C++抽象编程——算法分析(3)——深入了解Big-O

从代码中减少计算复杂度下面的代码计算的是vector中的元素的平均值。double average(vector & vec) { int n = vec.size(); double...
  • redRnt
  • redRnt
  • 2017年05月11日 19:02
  • 645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:O()算法表示分析
举报原因:
原因补充:

(最多只允许输入30个字)