关于算法复杂度

一、算法复杂度

算法复杂度,即算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度空间复杂度来考虑。

OK!看到此处,我想大家应该简单明白了算法复杂度是怎么一回事。如果你是计算机科班或者数学专业出身恰巧你的成绩又很不错的,那你就不需要继续往下看了。因为作者根本不是学计算机出身的,对于这些高深的知识,在查阅很多资料后也是似懂非懂,更不能向大家很好的阐述里面的道理。但又不想跟风去复制粘贴百度上的东西。所以,我想既然看到这里的读者应该绝大多数都是似懂非懂的。我认为在这么摆事实、讲道理就没意思了。如果能用现实中身边的例子来说明这些,那也是更好不过了。当然,作者若有机会也会好好折腾一番弄明白这里面究竟讲的是个啥。我想这也符合每一个力求上进的骚年所具备的心态。

1、时间复杂度

通过查看百度百科也大致了解到时间复杂度的大致意思。还有那些抽象的字母表达式。对于那些东西我就不在复制粘贴到此了。不如用更简洁易懂的实例来说说这里面的大致意思,在之前的一篇貌似是大学老师的博客里看到很有意思的说明。

假设CPU在短短几年内,速度提高了10呗。虽有有摩尔定律,这其实已经很夸张了。而我们的某个算法本可以写出时间复杂度是O(n)的算法,却写成了O(n^2)的程序,仅仅因为容易想到,也容易写。即在O(n^2)的时间复杂度程序下,速度其实只提高了10(根下100=10)倍。而对于O(n)时间复杂度的算法来说,那才是真的100倍。也就是说,一台老式CPU的计算机运行O(n)的程序和一台速度提高100倍新式CPU运行O(n^2)的程序,最终效率高的胜利方却是老式CPU的计算机。原因在于算法的优劣直接决定了程序运行的效率。由此可见,时间复杂度是非常重的一个衡量算法好快的事前估算的方法。

关于时间复杂度的计算方法不再赘述。这里说一下最坏情况平均情况的时间复杂度。当你早上起床准备出去吃饭上课的时候,到了宿舍楼下才突然响起来,手机忘记带了。这年头,钥匙、钱包、手机三大件,哪样也不能少啊。回宿舍打开门一看,手就在对门的窗台上放着。这当然是比较好的,基本没花什么时间。可是如果不在那里,你就得到处找。可能翻遍了书桌和壁橱,等找到的时候都快8点了,匆匆去上课,早饭算是泡汤了。找东西有运气好的时候,也有怎么都找不到的时候,但在现实中,通常我们碰到的绝大多数既不是最好也不最坏的,所以算下来是平均情况居多。

算法分析也是如此,在n个随即数中查找某个数字,最好的情况是第一个数字就是,此时时间复杂度为O(1),若最后一个数字才是我们要找的,那么时间复杂度是O(n),这是最坏的情况。而平均运行时间是从概率的角度看,若数字在每一个位置都可能出现,则平均查找次数为n/2次

平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。可现实中,平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算而来的。而最坏运行时间是一种保证,那就是运行时间不会再坏了。在应用中,这是最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏情况下的运行时间。即,时间复杂度是最坏情况下的时间复杂度。

常见的算法时间复杂度由小到大依次为:

O(1)<O(log2n)<O(n)<O(n log2 n)<O(n^2)<O(n^3)<O(2^n)

2、空间复杂度

空间复杂度的概念就简单许多了,简单来说就是在执行算法时所占用的内存资源。除去专业术语和计算方法,用大白话还真不知道怎么说的更多一些。

值得一提:

  对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。

  就好像我们解决一个问题时,有很多种解决办法,这里就对应了很多种算法。在选择某一种算法时,我们应该分析这种算法所带来的成本与收益。因为每一种算法都有其自己的特性,如果时间节省了,但就可能浪费空间。反之亦然。

 事后感慨:

 经过几个简单的算法的洗礼,突然发现之前做的东西太简单了。并不是说之前做的东西没有价值,而是从做技术的职业生涯来看,普通的编程也许很快就会遇到瓶颈。但研究了几个算法之后。似乎看到了一条更长远的道路,相比代码的累加,这种通过精心的设计而达到的优化效果显得更有趣味和挑战性。由此感慨,要学的东西还太多太多,不仅仅是经验的累加,更应该是智力和思维的突破。

时间: 2024-10-13 00:01:46

关于算法复杂度的相关文章

算法复杂度

一个算法中的语句执行次数称为语句频度或时间频度.记为T(n).n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化. 算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度. 一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度 O(1)<O(log 

每个程序员都应该收藏的算法复杂度速查表

算法复杂度这件事 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 O(Big-O)复杂度.我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住.最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo.eBay.LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大 O 速查表呢?”所以,为了节省大家的时间,我就创建了这个,希望你喜欢! — Eric 图例 绝佳 不错 一般

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

绪论算法复杂度

常见级数算法复杂度: 1,算数级数:与末项平方同阶 T(n)=1+2+3+...=n(n+1)/2=O(n2) 2,幂方级数:比幂次高出一阶 T2(n)=12+22+32+...n2=n(n+1)(2n+1)/6=O(n3) T3(n)=13+23+33+...n3=n2(n+1)2/4=O(n4) T4(n)=14+24+34+...n4=n(n+1)(2n+1)(3n2+3n-1)/30=O(n5) 3, 几何级数(a>1):与末项同阶 Ta(n)=a0+a1+a2+...an=(an+1-

数据结构基础 算法复杂度分析(一) 概念篇

为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执行的基本操作数量,或者称为算法复杂度(Algorithm Complexity) 如何衡量算法复杂度? 内存(Memory) 时间(Time) 指令的数量(Number of Steps) 特定操作的数量 磁盘访问数量 网络包数量 渐进复杂度(Asymptotic Complexity) 算法的运行时间与什么相关? 取决于输入的数据.(例

数据结构基础 算法复杂度分析(二) 典例篇

示例代码(1) decimal Factorial(int n) { if (n == 0) return 1; else return n * Factorial(n - 1); } [分析] 阶乘(factorial),给定规模 n,算法基本步骤执行的数量为 n,所以算法复杂度为 O(n). 示例代码(2) int FindMaxElement(int[] array) { int max = array[0]; for (int i = 0; i < array.Length; i++)

.NET平台BigO算法复杂度备忘

      之前一篇文章提到BIG O算法复杂度的备忘录, 今天这个是.NET 平台下集合类相关的Big O 算法复杂度   今天先到这儿,希望对您有参考作用, 您可能感兴趣的文章: 数据结构与算法 Big O 备忘录与现实 IT基础架构规划方案一(网络系统规划) 餐饮行业解决方案之客户分析流程 餐饮行业解决方案之采购战略制定与实施流程 餐饮行业解决方案之业务设计流程 供应链需求调研CheckList 企业应用之性能实时度量系统演变 如有想了解更多软件,系统 IT,企业信息化 资讯,请关注我的微

算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法.那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢? 这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析. 为了分析问题,需要假定图中所有边的容量都是整数.但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束. 首先将所有边的容量都初始化为0. 第一次迭代和第二次迭代之后,两条边各增加了1. 到最后200次迭代之后整个算法才结束. 这还不算最坏的情况.因为整数最多

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

算法复杂度的理解

算法复杂度的理解 from:http://blog.sina.com.cn/s/blog_4bab8e7f0102vmth.html 算法复杂度分为时间复杂度和空间复杂度. 时间复杂度的计算 ?1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了.并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多. 一个算法中的语句执行次数