数据结构与算法(Dart)之基础概念(一)

976 阅读3分钟

对于一个程序(或算法)性能的评估, 经常是从时间与空间两个维度来进行考虑。时间方面是指程序的运行时间, 称为"时间复杂度"。空间方面是程序在计算机内存所占的空间大小, 称为"空间复杂度"。

时间复杂度

我们可以就某个算法的执行步骤计数来衡量运行时间的标准,也是一科渐进表示法。一起来看一个例子,同样是两条指令:

a= a+1a=a+0.3/0.7*10005

由于涉及变量存储类型与表达式的复杂度,因此真正绝对精确的运行时间一定不相同。不过话又说回来,如此大费周章地精确计算程序的运行时间往往寸步难行,而且也亳无意义。因此用一种“估算”的方法来衡量程序或算法的运行时间反而更加怡当,这种估算的时间就是"时间复杂度”。详细定义如下:

在一个完全理想状态下的计算机中,我们定义 T(n)来表示程序执行所要花费的时间,其中n代表数据输入量。当然,程序的运行时间(Worse Case Executing Time)或最大运行时间是时间复杂度的衡量标准,一般以 Big-oh 表示。

分析算法的时间复杂度必须考虑它的成长比率 (Rate of Growth),往往是一种函数,时间复杂度也是一种“渐近表示法” (Asymptotic Notation)。

时间复杂度的几条基本计算规则

  • 基本操作,即只有常数项,认为其时间复杂度为 O(1)。
  • 顺序结构,时间复杂度按加法进行计算。
  • 循环结构,时间复杂度按乘法进行计算。
  • 分支结构,时间复杂度取各分支中的最大值。
  • 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
  • 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。

空间复杂度

所谓“空间复杂度”,就是估算一个算法在运行过程中临时占用内存空间的大小,是一种渐进表示法。而这些所需要的内存空间通常可以分为 “固定空间内存”(包括基本程序代码、常数、变量等)与“变动空间内存”(随程序运行时而改变大小的使用空间,例如引用类型变量。由于计算机硬件发展日新月异以及计算机不同, 因此纯粹从程序(或算法)的性能角度来看, 应该以算法的运行时间为主要评估与分析的依据。

常见的Big-Oh

事实上,时间复杂度只是执行次数的一个概略的估算,并非真实的执行次数。Big-oh 是一种用来表示最坏运行时间的估算方式,也是最常用于描达时间复杂度的渐近式表示法。

Big-Oh特色与说明
O(1)称为常数时间 (constant time),表示算法的运行时间是一个常数倍数
O(n)称为线性时间 (linear time),表示执行的时间会随着数据集合的大小而线性增长
O(log2n)称为次线性时间 (sub-linear time),成长速度比线性时间慢,而比常数时间快
O(n2)称为平方时间 (quadratic time),算法的运行时间会成二次方的增长
O(n3)称为立方时间 (cubic time),算法的运行时间会成三次方的增长
O(2n)称为指数时间 (exponential time),算法的运行时间会成2的口次方增长。例如解决非多项式问题 (Nonpolynomial Problem)算法的时间复杂度即为 O(2")
O(nlog2n)称为线性乘对数时间,介于线性和二次方增长的中间模式

截屏2024-01-06 23.38.09.png