408答疑
文章目录
一、数据结构的基本概念
- 文章链接: 点击跳转
二、算法和算法评价
- 文章链接: 点击跳转
三、参考资料
鲍鱼科技课件
b站免费王道课后题讲解:
网课全程班:
26王道考研书
四、总结
时间复杂度的通俗理解
O(1)
- 描述:表示算法的执行时间不随输入规模 n n n 的变化而变化,即无论输入规模如何,算法都能在常数时间内完成。
- 例子:酒店管理员将100把钥匙分别存放在100个编号格子中。当需要取出某号钥匙(如10号)时,直接根据编号定位到对应格子,无需额外操作。
- 特点:无论钥匙总数是100还是1000,查找时间均为常数级别。类似计算机通过索引直接访问内存地址的机制。
O(n)
- 描述:表示算法的执行时间与输入规模 n n n 成线性关系,即输入规模增加时,算法的执行时间也线性增加。
- 例子:酒店管理员将钥匙编号后用绳子串起来,需要从一串钥匙中找到特定房间的钥匙,这需要逐个检查每个钥匙。
- 特点: 数据量增加时,查找时间成比例增加(如100把钥匙需查100次,1000把需查1000次)。适用于无法直接通过索引定位的线性结构(如链表)。
O( n 2 n^2 n2)
- 描述:表示算法的执行时间与输入规模 n n n 的平方成正比,即输入规模增加时,算法的执行时间呈平方级增加。
- 例子:酒店扩大到100层,每层100个房间,钥匙按楼层和房间号排序,需要先找到楼层编号,再找到房间编号,这相当于双层循环的代码。
O( l o g 2 n log_2n log2n)
- 描述:表示算法的执行时间与输入规模 n n n 的对数成正比,即输入规模增加时,算法的执行时间对数级增加。
- 例子:钥匙有序存放时,采用二分查找法,例如查找23号钥匙:
- 将100把钥匙从中间(50号)分为两部分,确定23号在前半部分(1-50)。
- 继续将前半部分从中间(25号)分割,确定23号在1-25之间。
- 重复此过程,每次将搜索范围减半,直至找到目标钥匙。
- 特点:数据量翻倍时,操作时间仅增加一步。效率显著高于线性查找,适用于有序数据集(如二叉搜索树、二分算法)。
程序时间复杂度分析
循环主体中的变量参与循环条件的判断
在用于递推实现的算法中,首先找出基本运算的执行次数与问题规模之间的关系式,解得最高次幂,则算法的时间复杂度为 O ( n k ) O(n^k) O(nk)。例如:
- 设基本运算 i = i ∗ 2 i=i*2 i=i∗2 的执行次数为 t t t,则 2 t ≤ n 2^t \leq n 2t≤n,解得 t ≤ log 2 n t \leq \log_2 n t≤log2n,故 T ( n ) = O ( log n ) T(n) = O(\log n) T(n)=O(logn)。
int i = 1;
while (i <= n)
i = i * 2;
- 设基本运算 y = y + 1 y=y+1 y=y+1 的执行次数为 t t t,则 t = y − 5 t=y-5 t=y−5,且 ( t + 5 + 1 ) ( t + 5 + 1 ) < n (t+5+1)(t+5+1) < n (t+5+1)(t+5+1)<n,解得 t < n − 6 t < \sqrt{n}-6 t<n−6,即 T ( n ) = O ( n ) T(n) = O(\sqrt{n}) T(n)=O(n)。
int y = 5;
while ((y + 1) * (y + 1) < n)
y = y + 1;
循环主体中的变量与循环条件无关
此类题可采用数学归纳法或直接累计循环次数。多层循环时从内到外分析,忽略单步语句、条件判断语句,只关注主体语句的执行次数。此类问题又可分为递归程序和非递归程序:
-
递归程序一般使用公式进行递推。时间复杂度的分析如下:
T ( n ) = 1 + T ( n − 1 ) = 1 + 1 + T ( n − 2 ) = ⋯ = n − 1 + T ( 1 ) T(n) = 1 + T(n-1) = 1 + 1 + T(n-2) = \cdots = n - 1 + T(1) T(n)=1+T(n−1)=1+1+T(n−2)=⋯=n−1+T(1)
即 T ( n ) = O ( n ) T(n) = O(n) T(n)=O(n)。 -
非递归程序的分析比较简单,可以直接累计次数。