您的位置:首页 > 其它

2. 时间复杂度与空间复杂度

2018-01-25 17:16 363 查看
  本文是《小甲鱼数据结构》的学习笔记,对视频课程中的相关知识进行总结。

  欢迎大家在评论区多多留言互动~~~~

1. 算法效率的度量方法

1.1 事后统计方法

  这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率高低。

  这种方法的缺陷在于:(1)必须依据算法实现编制好测试程序通常需要花费大量的时间和精力,但是如果发现测试的算法很糟糕的话就得不偿失。(2)不同的测试环境差别很大。

1.2 事前分析估算法

  在计算机编写程序前,依据统计方法对算法进行估算。

1.2.1 影响时间消耗的因素

  (1)算法所采用的策略和方案

  (2)编译产生代码的质量(主要与编译器有关)

  (3)问题的输入规模

  (4)机器执行指令的速度

  抛开与计算机硬件和软件相关的因素,一个程序运行时间依赖于算法的好坏和问题的输入规模。所以我们在研究算法的复杂度的时候,侧重的是算法的随着输入规模的扩大的增长量的一个抽象,而不是精确地定位需要总共执行多少次。所以在实际分析中,不计那些循环索引的递增和循环终止条件、变量声明、打印结果等操作。最终在分析程序运行时间时,最重要的时把程序看成是独立于程序设计语言的算法或者时一系列的步骤;重要的时把基本操作的数量和输入模式关联起来。

1.2.3 函数的渐进增长

  通过分析可以知道,判断一个算法的效率时,函数中的常数和其他次项常常可以忽略,而更应该关注阶数最高的项,对于阶数最高的项,也可以忽略他们的常数(即系数)。

2. 时间的复杂度

2.1 时间复杂度的定义

  再进行算法分析时,语句总的执行次数T(n)是关于问题规模n 的函数,进而分析 T(n) 随 n 的变换情况并确定 T(n) 的数量级。算法的时间复杂度,也就是算法的时间量度,记作 T(n)=O(f(n)) 。他表示随问题规模n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中的 f(n) 是问题规模 n 的某个函数。

  其中最关键的是,执行次数==时间,寻找的执行次数与问题规模规模之间数量级之间的关系。

2.2 时间复杂度的记法

  时间复杂度常记作 O(),即大 O 阶,而计算大 O 阶有着下面的规律

  (1)用常数1取代运行时间中的所有加法常数;

  (2)再修改后的运行次数函数中,只保留最高项;

  (3)如果最高解项存在且不是1,则除去与这个项相乘的常数;

  (4)得到的最后结果就是大 O 阶。

2.3 常见的时间复杂度

  常见的时间复杂度有常数阶,线性阶,平方阶,立方阶,对数阶等。

  如下面的程序



这个的内层循环的次数会随着迭代的增加而逐渐减少,总的执行次数是100+99+……+1,通过计算可知总的执行次数是 n22+n2,通过上面的四条规律可以知道,这个程序的时间复杂度仍是 O(n)。

  再考虑下面的程序



假设程序执行了 x 次之后停止了,这个时候 2x=100,则 x=log1200,故一共执行了 log1200次。因此时间复杂度是 O(logn)。

2.4 函数调用的时间复杂度分析

  首先对下面这段程序进行时间复杂度分析



其中的函数的时间复杂度是 O(1),总共执行了n 次,所以这段程序的时间复杂度是 O(n)。

  加入将时间复杂度变为现在的形式



虽然是调用函数,但是实际上就是之前所讲的随着迭代内循环逐渐减少的形式,这个时候他的时间复杂度是 O(n2)。

  现在又将程序变为如下图所示的程序



其中第一行执行1次,第二行执行 n 次,第一个 for 循环执行 O(n2)次,第二个循环也执行 O(n2) 次,将这些相加最后得到整体的时间复杂度为 O(n2)。

2.5 常见的时间复杂度

  常见的时间复杂度有以下这些



常见的时间复杂度所耗费的时间从小到大依次是

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

在上面的这些情况中,像 O(n3) 之后的这些,由于 n 值的增大会使结果达到难以想象,所以不会使用也不需要讨论。

2.6 最坏情况与平均情况

  在一个数组中查询某个元素的时候,可能第一个就遇到,那么是 O(1),但是也有可能最后遇到,这个时候是 O(n),所以就有平均情况与最坏情况之分。平均情况是值期望的运行时间。

  最坏运行时间是一种保证。在应用中,这是一种最重要的需求,通常没有指定的话,所提到的运行时间都是最坏情况的运行时间。

3. 算法的空间复杂度

  它是指通过计算算法所需的存储空间,记作 S(n)=O(f(n)),其中n 是问题的规模,f(n) 是语句关于 n 所占存储空间的函数。

  通常,我们都是用时间复杂度来指运行时间的需求;用空间复杂度来指空间需求。当我们求“复杂度”的时候所指的就是时间复杂度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法