数据结构与算法(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) 称为线性乘对数时间,介于线性和二次方增长的中间模式
相关推荐
蒙奇D索大24 分钟前
【算法】递归算法的深度实践:从布尔运算到二叉树剪枝的DFS之旅
笔记·学习·算法·leetcode·深度优先·剪枝
卡提西亚1 小时前
C++笔记-25-函数模板
c++·笔记·算法
ghie90901 小时前
MATLAB/Simulink水箱水位控制系统实现
开发语言·算法·matlab
多多*2 小时前
分布式系统中的CAP理论和BASE理论
java·数据结构·算法·log4j·maven
yuan199972 小时前
基于粒子群优化(PSO)算法的PID控制器参数整定
算法
小白程序员成长日记2 小时前
2025.11.10 力扣每日一题
数据结构·算法·leetcode
hoiii1872 小时前
基于交替方向乘子法(ADMM)的RPCA MATLAB实现
人工智能·算法·matlab
fengfuyao9853 小时前
MATLAB的加权K-means(Warp-KMeans)聚类算法
算法·matlab·kmeans
循环过三天3 小时前
3.1、Python-列表
python·算法
dragoooon344 小时前
[优选算法专题六.模拟 ——NO.40~41 外观数列、数青蛙]
数据结构·算法·leetcode