ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

数据结构入门:从数组到图,掌握程序性能的关键骨架(easy-vibe 计算机基础篇)

2026/9/25 2:43:23 拓冰建站 浏览量
数据结构入门:从数组到图,掌握程序性能的关键骨架(easy-vibe 计算机基础篇) 教程文档【免费下载链接】easy-vibe从 0 到 1 学会 vibe coding项目制学习项目地址https://gitcode.com/datawhalechina/easy-vibe点击查看免费下载数据结构是程序处理数据的整理方法决定了程序在数十条还是数万条数据面前的表现。本篇是 Datawhale easy-vibe 项目 计算机基础附录 的《数据结构》章节的完整讲解以程序 数据结构 算法为主线系统梳理数组、链表、栈、队列、哈希表、树、图七类核心结构的原理、复杂度与适用场景并给出可直接上手的选型决策流程。读完本文你将能对需求做出直觉判断、用时间/空间复杂度视角定位性能瓶颈并为数据库索引、缓存系统、搜索引擎等后续技术打下基础。1. 为什么先学数据结构程序的快慢藏在整理方式里在 计算机组成原理 中我们了解了 CPU 如何执行指令在 操作系统 中了解了 OS 如何管理资源。但程序真正处理的核心对象是数据——用户信息、商品列表、社交关系……这些数据在内存里如何组织直接决定程序的速度。你可能好奇过为什么有的程序能秒级处理数万条记录有的程序几百条就卡死答案往往就藏在数据结构的选择里。用一个整理书籍的例子来建立直觉堆在地上找一本书要一本本翻——这是最原始的存储方式按编号排上书架直接走到对应位置取——这就是数组按分类分柜存放先确定柜子再找书——这就是哈希表按标题字母序放在多层架上每次排除一半——这就是树。同样的书只是整理方式不同查找效率天差地别。数据结构就是数据的整理方法——它决定数据如何存储、如何查找、如何修改。本附录章节在设计上并非停留在文字层面而是配套了交互式演示组件。文档中嵌入的DataStructureOverviewDemo整体分类演示、DataStructureDemo性能对比演示、DataStructureSelectorDemo选型向导演示等 Vue 组件均注册于 docs/.vitepress/theme/index.js源码位于docs/.vitepress/theme/components/appendix/computer-fundamentals/目录。读者可以在阅读本站文档时直接与这些可视化演示交互把抽象的复杂度曲线变成直观感受。所有数据结构可以归入四大类类型数据关系典型代表生活类比线性结构1 对 1排成一列数组、链表、栈、队列火车车厢、排队哈希结构键 → 值映射哈希表、字典、集合图书馆索引卡树结构1 对多层级关系二叉树、B 树、堆家谱、文件夹图结构多对多网络关系有向图、无向图地铁线路图、社交网络::: tip 为什么学这么多种 因为不存在万能的数据结构。每一种结构都是在查找速度、插入速度、内存占用之间做取舍。搬家具不会用背包送一封信不会用卡车——选对工具事半功倍。 :::2. 线性结构最基础的整理方式线性结构是最直观的数据组织方式——数据一个个排开像火车车厢。但怎么连和从哪端操作的差异演化出四种各有擅长的变体。2.1 数组 vs 链表两种截然不同的存储方式数组和链表是最基础的两个线性结构核心差异在内存布局对比项数组链表内存布局连续的一块散落各处用指针串联访问第 n 个直接计算地址O(1)从头逐个找O(n)中间插入后续元素全部搬移O(n)改写两个指针O(1)大小创建时固定随时可扩展生活类比编号储物柜寻宝游戏的线索链从内存布局出发两者的优劣就一目了然数组因为元素在内存中连续排布对 CPU 缓存cache友好遍历时能顺序预取链表虽然插入删除灵活但每个节点额外存储指针、节点散落内存遍历会产生大量缓存未命中。数据量已知、按下标访问频繁 → 选数组如成绩表、像素矩阵数据量未知、插入删除频繁 → 选链表如播放列表、UNDO 历史。拿不准时优先数组——大多数场景下数组的缓存亲和性带来的性能优势更大。2.2 栈与队列加了规则的线性结构栈和队列本质上就是数组或链表但在操作方式上加了限制。功能看似变少了正是这些限制造就了明确的使用场景结构规则操作类比你代码里的位置栈后进先出LIFOpush / pop叠盘子函数调用栈、浏览器后退、CtrlZ 撤销队列先进先出FIFOenqueue / dequeue排队买票任务调度、消息队列、打印队列为什么限制反而是好事试想一个只有放盘子取盘子两个操作的栈——顺序永远不会弄错。限制带来确定性确定性带来可靠性。函数调用栈正是依靠后进先出保证最后被调用的函数最先返回如果中间某个函数能被随意访问程序必然混乱。3. 哈希表最速查找线性结构的查找都不够快——数组遍历 O(n)即使有序配合二分查找也要 O(log n)。有没有O(1) 直接命中的结构有就是哈希表。3.1 哈希表的核心思路哈希表的原理极简传入键如apple哈希函数把键转换成数值如hash(apple) 3直接访问数组的第 3 个位置——无需遍历一步到位。这就像图书馆的索引系统不必一排排找书架看索引卡就能直达书籍位置。在你日常写的每一行代码背后哈希表都在默默工作JavaScript 的{}对象与Map→ 哈希表user[name]、map.get(key)Python 的dict→ 哈希表Java 的HashMap→ 哈希表数据库索引 → 内部同样使用哈希。# Python dictO(1) 平均查找 user {name: alice, age: 18} print(user[name]) # 直接定位无需遍历// JavaScript Map同样基于哈希表 const map new Map([[key, 42]]); map.get(key); // O(1) 平均3.2 哈希冲突两个键撞车了怎么办不同的键可能算出同一个下标这就是哈希冲突——好比两本书的索引号相同、指向同一位置。两种主流解法解法原理类比链地址法chaining同一位置用链表串起多个值同一个储物柜放多本书开放定址法open addressing冲突后向后找空位柜子满了就放隔壁柜3.3 哈希表的性能操作平均情况最坏情况全部冲突查找O(1)O(n)插入O(1)O(n)删除O(1)O(n)::: warning 何时退化 当所有键都被映射到同一个下标时哈希表会退化成一条链表所有操作变成 O(n)。规避手段选择良好的哈希函数 动态扩容负载因子超过阈值时扩大容量、重新散列。 :::4. 树结构表达层级关系哈希表查找快但数据没有顺序。既要快速查找又要保持数据有序就需要树结构。树的核心特征每个节点可以有多个子但只有一个父根节点除外。这种 1 对多的层级关系在现实中无处不在文件系统的文件夹嵌套、HTML 的 DOMhtml→body→div→p、嵌套的 JSON/XML 数据本质上都是一棵树。4.1 二分搜索树有序的树二分搜索树有一条简单却强力的规则左小右大。左子树的所有值 根节点右子树的所有值 根节点。查找时每次比较都能排除一半节点时间复杂度 O(log n)。就像猜数字游戏——比 50 大小大。比 75 大小——每次都排除一半。4.2 平衡树防止退化二分搜索树有个隐患数据按顺序插入1, 2, 3, 4, 5时树会退化成一条链查找跌回 O(n)。平衡树通过自动调整结构规避这一问题类型平衡策略特点典型用途AVL 树严格平衡高度差 ≤ 1查找最快插入删除略慢查找频繁的场景红黑树近似平衡综合性能良好Java TreeMap、Linux 内核B 树多叉平衡单节点存多个值减少磁盘 I/O数据库索引::: tip 树就在你的代码里文件系统文件夹嵌套即树HTML DOMhtml→body→div→p是一棵树数据库索引B 树让数百万条数据的检索仅需 34 次磁盘读取JSON/XML嵌套数据格式本质是树。 :::5. 图结构复杂关系的网络树只能表达1 对多的层级。但现实里多对多的关系更多——你的朋友也有朋友城市之间有不止一条路。这种任意节点间都可能存在连接的结构就是图。5.1 图的三种形态类型特征类比典型用途无向图边无方向A→B 与 B→A 相同LINE 好友双向社交网络、通信网络有向图边有方向A→B 与 B→A 不同Twitter 关注单向Web 链接、依赖关系带权图边上带权值距离、成本等城市间道路含距离地图导航、最短路5.2 图的遍历图比线性结构复杂可能存在环A→B→C→A因此必须记录已访问节点防止死循环遍历方式策略类比适用场景BFS广度优先先访问所有邻居再访问邻居的邻居水波扩散最短路、按层遍历DFS深度优先一条路走到黑走不通就回头走迷宫路径搜索、连通性判断::: tip 图的现实应用地图导航城市是节点、道路是边导航就是图上的最短路搜索社交网络用户是节点、关注/好友是边可能认识的人来自图算法推荐包管理器npm/pip 的依赖关系是有向图npm install的解析过程本质上是对图做拓扑排序。 :::6. 性能对比一张表看穿所有结构主要性能对比表均为平均情况数据结构访问查找插入删除空间数组O(1)O(n)O(n)O(n)O(n)链表O(n)O(n)O(1)O(1)O(n)栈 / 队列O(n)O(n)O(1)O(1)O(n)哈希表—O(1)O(1)O(1)O(n)二分搜索树—O(log n)O(log n)O(log n)O(n)图—O(VE)O(1)O(E)O(VE)::: tip 这张表怎么读O(1)与数据量无关操作时间恒定——最快O(log n)数据量翻倍只多 1 步——相当快O(n)数据量翻倍时间也翻倍——一般O(VE)取决于节点数 V 与边数 E——图特有的表达。注意以上均为平均情况。最坏情况下哈希表会退化成 O(n)二分搜索树同样会退化成 O(n)。 :::7. 选型指南到底该用哪个面对真实需求关键是从需求出发问自己几个问题最频繁的操作是什么查找插入删除遍历数据之间的关系是什么1 对 11 对多多对多数据量有多大几十条与几百万条最优选择可能完全不同需要有序吗是否要按特定顺序遍历数据本站文档中还嵌入了DataStructureDemo交互式性能对比与DataStructureSelectorDemo选型向导两个演示组件源码见docs/.vitepress/theme/components/appendix/computer-fundamentals/注册于 docs/.vitepress/theme/index.js可通过实际操作验证下表结论。快速决策流程你的需求推荐结构理由按下标快速访问数组O(1) 随机访问中间频繁插入删除链表O(1) 插入删除无需搬移元素后进先出撤销、递归栈LIFO 语义天然契合先进先出任务队列队列FIFO 语义天然契合按键快速查找哈希表平均 O(1) 查找有序数据 快速查找二分搜索树O(log n) 查找且保持有序复杂多对多关系图可表达任意节点间连接::: tip 实战开发经验法则80% 的场景用数组和哈希表就够需要有序再考虑树关系复杂再考虑图拿不准从最简单的开始出现性能问题再换——过早优化是万恶之源。 :::总结数据结构是程序的骨架数组像编号储物柜按位置取最速链表像寻宝线索链插入删除最灵活哈希表像图书馆索引按名字找最速树像家谱表达层级且保持有序图像地铁线路图表达任意复杂网络关系。没有最好的数据结构只有最合适的——关键是理解每种结构的收益与代价基于真实需求做取舍。继续学习主题推荐资源数据结构可视化VisuAlgo——各类数据结构与算法的动画讲解可在站点内搜索对应条目算法与数据结构入门《算法图解》Aditya Bhargava 著图解丰富适合入门深入理解《数据结构与算法分析》Mark Allen Weiss 著练习LeetCode——按数据结构分类的练习题库下一步掌握了数据结构的核心知识接下来可以继续学习同一附录取的后续章节算法导论用排序、查找、递归、动态规划等算法思想解决问题编程语言概念理解各种编程语言如何实现这些数据结构。这两章与本文同属 easy-vibe 项目的计算机基础附录构成了从数据如何组织到算法如何求解再到语言如何落地的完整知识链是后续学习数据库索引、缓存系统与搜索引擎等上层技术的地基。赞分享教程文档【免费下载链接】easy-vibe从 0 到 1 学会 vibe coding项目制学习项目地址https://gitcode.com/datawhalechina/easy-vibe点击查看免费下载相关推荐Easy-Vibe 计算机基础数据结构入门——从数组到图用「组织方式」理解程序性能Easy Vibe 计算机基础数据结构入门——从数组到图用「组织方式」理解程序性能 导读本文是 Easy VibeAI 原生产品构建者第一课计算机基础教程文档人工智能Vibe Codingeasy-vibe 计算机基础篇数据结构完全指南——从数组到图掌握存储方式与性能权衡easy vibe 计算机基础篇数据结构完全指南——从数组到图掌握存储方式与性能权衡 本文是 easy vibe 项目「计算机基础」系列 docs/ar教程文档easy-vibe 数据结构导论掌握程序性能的骨架从线性结构到图的完整选型指南easy vibe 数据结构导论掌握程序性能的骨架从线性结构到图的完整选型指南 导读 本篇是 easy vibe 计算机基础课程 docs/es es/a教程文档人工智能Vibe Coding上一篇揭秘SlothMac系统进程监控的终极可视化工具下一篇JSFuck生态系统工具链、测试与开发环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考