数据结构初阶:时间与空间复杂度解析
数据结构的重要性不言而喻,无论是面试还是实际工作,面对海量数据或复杂逻辑关系时,巧妙运用数据结构能梳理问题脉络,找到简洁的解题思路。
什么是数据结构与算法?
数据结构指相互之间存在一种或多种特定关系的数据元素的集合。简单来说,就是组织和存储数据的方式,让数据能被高效地访问、修改、增删。就好比把杂乱的物品用不同的收纳工具和方法归置整齐。
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。它接收特定的输入,经过有限个步骤的处理,产生对应的输出。打个比方,算法就像是一份精准的菜谱,食材是输入,按照菜谱上的步骤烹饪后得出的菜肴就是输出。
如何学好算法和数据结构?
数据结构偏向于底层逻辑,学习重要的不是学了很多,而是对于每个数据的代码,都知道为什么这么写。
- 时常问问自己为什么这里的代码这样写
- 多画图梳理逻辑
- 多写几遍代码
- 和不会的问题死磕到底,钻研不出来就问人
算法效率评估
如何判断一个算法的好坏,主要从时间和空间来考量。算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,存储容量很小,所以对空间复杂度很是在乎。如今存储容量已很高,我们通常更关注时间复杂度,但空间复杂度依然重要。
时间复杂度详解
概念
在计算机科学中,算法的时间复杂度是一个函数,定量描述了该算法的运行时间。理论上无法直接算出程序运行的确切时间,只有上机测试才知道。但这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
举个例子,计算 Func1 中 ++count 语句总共执行了多少次:
void Func1(int N) {
int count = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
++count;
}
}
for (int k = 0; k < 2 * N; ++k) {
++count;
}
int M = 10;
while (M--) {
++count;
}
printf("%d\n", count);
}
注意我们要计算的是程序语句执行了多少次,而不是单纯花费的时间。
Func1 执行的基本操作次数:$F(N) = N^2 + 2*N + 10$
首先是两层循环每次执行 $N^2$ 次,接着一次循环执行 $2N$,最后执行 10 次。



