[算法] 循环、级数、复杂度

本文源自清华大学邓俊辉老师的《数据结构》课程,探讨了循环与级数的关系及其在计算复杂度中的体现。通过实例解析了不同类型的循环结构如何导致O(n^2)的复杂度,并引入了一种复杂度为O(log n)的情形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文根据清华大学邓俊辉老师课程《数据结构》总结,课程地址

循环和级数之间的关系,怎样确定其复杂度,有以下几种常见的情况。

1

for (int i=0; i<n; i++)
	for (int j=0; j<n; j++)
		O1Operation(i, j); 

外层(i)有 n 层循环,也就是n 项相加。内层(j)每层循环 n 次,也就是每项计算 n 次。加一起复杂度为 O ( n 2 ) O(n^2) O(n2)

∑ i = 0 n − 1 n = n + n + . . . + n = n ∗ n = O ( n 2 ) \sum^{n-1}_{i=0} n = n + n + ... + n = n*n = O(n^2) i=0n1n=n+n+

### 如何计算算法的时间复杂度 时间复杂度是用来描述算法执行所需时间的增长趋势的一种方式。通常通过分析算法中的基本操作次数来估算其增长速度[^1]。 对于一个给定的算法,可以通过以下方式进行时间复杂度的计算: - **确定输入规模**:找到影响算法性能的主要因素作为输入规模 \( n \),比如数组长度、节点数量等。 - **找出基本操作**:识别出算法中最常被执行的操作(通常是循环内部的关键语句),并统计该操作被重复执行的总次数。 - **忽略低阶项和系数**:只保留最高次幂的部分表示渐近增长率,从而得到最终的 O 表达式。 例如,在冒泡排序中,两层嵌套循环导致比较交换动作会随着数据量增加呈平方级数上升,因此它具有 \( O(n^2) \) 的最坏情况下的时间复杂度[^2]。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break ``` 上述代码展示了经典的冒泡排序实现过程,其中外层 `for` 循环迭代整个列表一次,内层则负责相邻元素之间的对比调整位置直到序列有序为止。由于每次都需要重新扫描剩余未处理部分所以整体呈现二次方关系特性即 \( O(n^2)\)。 --- ### 计算空间复杂度的方法 空间复杂度是指程序除了原始输入之外还需要多少额外内存资源才能完成运算任务。一般情况下考虑辅助变量占用的空间小以及递归调用栈深度等因素的影响程度。 一些常见情形如下所示: - 如果只是简单地利用几个固定类型的局部变量,则认为这些不会随问题尺寸变化而改变,故此属于恒定量级别——\( O(1) \); - 当采用原地标记或者就地修改策略时也保持不变同样适用前述结论如堆排序之类方法均只需很小范围内的临时存储单元即可满足需求因而它们都具备优秀的空间效率特征表现为线性以内甚至更优水平; - 对于那些需要用到显式的队列结构或者其他形式的数据容器保存中间状态信息的情况可能就会涉及到更多动态分配区域进而使得总体消耗有所提升达到一定比例之后便呈现出相应规律性的关联模式出来比如说快速排序过程中因分区划分产生的子区间记录就需要借助栈帧机制来进行管理于是就有了从对数值到实际物理地址映射之间转换所带来的附加开销估计约处于对数至线形范围内波动不定具体取决于具体情况设定条件差异所致. 综上所述,无论是评估何种特定场景下所对应的时空属性表现状况都应该紧密结合实际情况加以细致考量以便能够得出更为精确合理的判断依据供后续优化改进措施制定参考之需. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值