🚀 数据结构与算法基础入门 ------ 从概念到复杂度
在学习计算机专业课程的过程中,"数据结构与算法"绝对是绕不过去的一门基础课。它不仅决定你编程的底层思维方式,也是校招面试、笔试中最常考的核心内容之一。
本文将结合两份课程内容(数据结构前言 + 时间复杂度与空间复杂度),从零帮你理清:
- 什么是数据结构?什么是算法?
- 为什么要学?企业为什么这么爱考?
- 时间复杂度空间复杂度到底怎么分析?
- 常见计算复杂度有哪些?
- 如何高效入门数据结构与算法?
📌 一、什么是数据结构?
数据结构(Data Structure)是组织和存储数据的方式,它描述不同数据之间的逻辑关系。
可以简单理解为:
- 顺序表:像一排连续的箱子
- 链表:一个个节点手拉手
- 栈:先进后出
- 队列:先进先出
- 树:带层级的结构
- 哈希表:依赖"映射"的结构
数据结构更关心:
👉"数据之间如何组织?"
👉"操作这些数据的过程是否高效?"
📌 二、什么是算法?
算法(Algorithm)是输入转化为输出的一组可执行步骤。
核心特征:
- 输入:可以是一个或多个值
- 输出:产生期望的结果
- 有穷性:执行有限步数
- 确定性:每一步都明确
- 有效性:操作足够基础可实现
例如:斐波那契数列:
c
long long Fib(int n)
{
if (n < 3)
return 1;
return Fib(n-1) + Fib(n-2);
}
看起来优雅,但运行效率非常低,这也是我们要用"复杂度"衡量算法好坏的原因。
📌 三、数据结构与算法为什么这么重要?
无论是笔试还是面试,数据结构与算法都是"核心考点"。
🎯 1. 校招笔试为什么考算法?
现在大厂笔试大多是 Online Judge 模式:
- 20~30 道选择题
- 3~4 道编程题
选择题多半围绕:
- 栈与队列
- 链表操作
- 排序算法
- 树与二叉树
- 哈希表
- 指针、内存、递归等
编程题基本都是算法题,典型例如:
- 链表反转
- 有序数组查找
- 字符串处理
- 排序
- BFS/DFS
🎯 2. 面试为什么反复考算法?
典型面试问题(来自你文件中提供的真实案例):
- 如何判断栈或队列是否为空?
- 如何用两个栈实现一个队列?
- Vector 和数组的区别是什么?
- 判断两个链表是否相交?
- 写一个模板函数比较两个数?
- 快速排序思想是什么?
- 红黑树的性质?
- HashMap 的底层实现?
- 如何检测内存泄漏?
- TCP 为什么要三次握手?
可以看到:几乎所有问题都和数据结构 & 算法密切相关。
🎯 3. 工作中为什么依然需要算法?
算法并不是"学了为了考试"。
它会体现在你未来的所有工作里,例如:
- 选择合适的数据结构能让程序效率提升 10 倍
- 是否懂复杂度决定写出的代码是否能承受海量数据
- 解决业务瓶颈需要算法思想(例如缓存、索引、并发)
📌 四、如何学好数据结构与算法?(超实用学习路线)
文件中提到两个建议,我为你扩展成可执行路径:
✔ Step 1:死磕代码(亲自敲)
光看是学不会的,一定要"写、调、画图、调试"。
✔ Step 2:画图理解
链表、栈、队列、二叉树、递归,都离不开画图。
尤其是理解:
- 递归栈帧
- 二叉树结构
- 排序过程
- 哈希冲突
✔ Step 3:练题(硬实力提升最快)
推荐顺序:
① 剑指 Offer (基础入门)
② 程序员代码面试指南 (进阶)
③ LeetCode 高频题 300 道
📌 五、算法的时间复杂度 & 空间复杂度(重点讲解)
在 Lesson2 中,大部分内容都聚焦在"如何分析一个算法的好坏"。
下面对核心知识点进行讲解。
⭐ 1. 什么是时间复杂度?
衡量算法运行快慢的指标。
描述的是 "基本操作执行次数 与 输入规模 N 的函数关系"。
例如:
c
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
count++;
}
}
执行次数约为:
N × N = N²
所以时间复杂度:
👉 O(N²)
🧠 大 O 推导法(三步走)
- 用 1 替换所有低阶项、常数项
- 取最高阶项
- 去掉系数
例:
3N² + 5N + 10 → N² → O(N²)
⭐ 2. 常见时间复杂度(从快到慢)
| 复杂度 | 名称 |
|---|---|
| O(1) | 常数级 |
| O(logN) | 对数级(二分、折半、平衡树) |
| O(N) | 线性 |
| O(NlogN) | 快排/归并的典型复杂度 |
| O(N²) | 双层循环 |
| O(2ⁿ) | 指数级(最慢) |
⭐ 3. 常见示例解析
📌 例 1:线性复杂度 O(N)
c
for(int i=0;i<2*N;i++)
count++;
📌 例 2:双重循环 O(N²)
c
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
count++;
📌 例 3:二分查找 O(logN)
c
int BinarySearch(int* a, int n, int x)
每次把范围砍一半,一直砍到只剩 1 个,因此是对数级。
📌 例 4:冒泡排序 O(N²)
双层循环,最坏 O(N²),最好 O(N)。
📌 例 5:递归 Fibonacci(低效实现)O(2ⁿ)
c
Fib(n-1) + Fib(n-2)
递归树呈指数级增长。
⭐ 4. 空间复杂度
衡量算法 额外占用的空间。
例如:
📌 O(1) 空间
c
long long Fac(size_t n)
只有常数变量,无额外开辟空间。
📌 O(N) 空间
c
long long* Fibonacci(size_t n)
{
long long* arr = malloc(n+1);
...
}
开辟了长度为 N 的数组。
📌 递归的空间复杂度
每一次递归都需要开一个"栈帧"。
例如:
c
Fac(n)
递归 n 次 → 空间复杂度:O(N)
📌 六、数据结构与算法的刷题建议
结合文件中的推荐:
✔ 刷题顺序:
- 《剑指 Offer》
- Nowcoder OJ(牛客网)
- LeetCode
题目如:
- 消失的数字
- 旋转数组
- 链表反转
- 二分查找
- 冒泡/快排
🎉 结语
数据结构与算法是程序员的"内功"。