数据结构知识点总结:高效编程的底层逻辑

数组:最基础也最常用

数组就像一排整齐的储物柜,每个格子有固定编号,存取速度快得像伸手拿东西。比如你要记录一周每天的步数,用一个长度为7的数组刚好,arr[0]是周一,arr[6]是周日。但问题也很明显——想中间插个数据?后面全得往后挪,效率低。

int steps[7] = {8000, 7500, 9200, 6800, 10000, 12000, 11500};

链表:灵活的积木式结构

链表像是用绳子串起来的一串钥匙,每把钥匙(节点)都带着下一个的位置信息。插入删除特别方便,比如微信聊天记录,新消息来了直接挂到最后就行,不用挪动前面的内容。但代价是不能“随机访问”,想看第10条?只能从头一个个数过去。

struct ListNode {
int val;
ListNode* next;
};

栈和队列:两种特殊的数据规矩

栈是“后进先出”,像自助餐厅叠放的盘子,最后放上去的最先被拿走。函数调用、浏览器返回按钮都靠它。队列则是“先进先出”,像排队买奶茶,谁先来谁先被服务。消息队列、打印任务调度都是典型场景。

哈希表:快速查找的秘密武器

你输入手机号,系统瞬间显示姓名,这背后多半是哈希表在干活。它通过一个函数把键(比如手机号)转成数组下标,实现接近O(1)的查询速度。当然,冲突难免,拉链法、开放寻址这些方法就是用来解决“两个号撞到同一个位置”的尴尬。

unordered_map<string, string> phoneBook;
phoneBook["13800138000"] = "张三";

树:分层管理的智慧

文件夹嵌套、组织架构图,这些都是树形结构的影子。二叉搜索树让左边小、右边大,查找效率比线性扫描高不少。但怕不平衡,左歪右斜之后就退化成链表了。于是有了AVL树、红黑树这些自平衡的高手,Linux进程调度就在用红黑树。

堆:优先级队列的实现基础

急诊室看病,不是先来先治,而是谁病情重谁先上。堆就是干这个的——最大堆根最大,最小堆根最小。每次取出顶端元素,再自动调整,保证下次还能快速找到最值。任务调度、Dijkstra最短路径算法都离不开它。

图:关系网络的抽象模型

社交网络里谁认识谁,地图上城市怎么连通,这些复杂关系都用图来表示。邻接矩阵适合稠密图,邻接表更省空间。遍历方式有深度优先(DFS)和广度优先(BFS),前者像钻迷宫一条路走到黑,后者像水波一圈圈扩散。

// 邻接表表示图
vector<vector<int>> graph(5);
graph[0].push_back(1);
graph[0].push_back(2);