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

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

时间复杂度

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

css 复制代码
a= a+1与a=a+0.3/0.7*10005

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

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

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

空间复杂度

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

常见的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) 称为线性乘对数时间,介于线性和二次方增长的中间模式
相关推荐
bubiyoushang88818 分钟前
MATLAB实现雷达恒虚警检测
数据结构·算法·matlab
wu_asia21 分钟前
编程技巧:如何高效输出特定倍数数列
c语言·数据结构·算法
AlenTech30 分钟前
207. 课程表 - 力扣(LeetCode)
算法·leetcode·职场和发展
练习时长一年1 小时前
LeetCode热题100(杨辉三角)
算法·leetcode·职场和发展
lzllzz232 小时前
bellman_ford算法
算法
栈与堆2 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
sunfove2 小时前
麦克斯韦方程组 (Maxwell‘s Equations) 的完整推导
线性代数·算法·矩阵
Rui_Freely2 小时前
Vins-Fusion之 SFM准备篇(十二)
人工智能·算法·计算机视觉
yyy(十一月限定版)2 小时前
matlab矩阵的操作
算法·matlab·矩阵
努力学算法的蒟蒻2 小时前
day58(1.9)——leetcode面试经典150
算法·leetcode·面试