ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据结构零基础入门:从数组链表到哈希树图,一文吃透核心概念与学习路线

数据结构零基础入门:从数组链表到哈希树图,一文吃透核心概念与学习路线 先说结论数据结构这门课劝退的人多吃透的人香。作为计算机专业里公认的“地基课”它不直接教你怎么写出一个网站也不直接教你怎么调一个模型但它决定了你写出来的代码在数据量从一百涨到一百万的时候还能不能撑得住。这篇文章我就以“绪论”为起点把数据结构到底是什么、为什么重要、里面有哪些核心概念和经典结构、以及新手怎么学才能不走弯路这几件事一次性讲明白。不管你是刚上大一的科班学生是准备考研、在啃“王道数据结构”的复习党还是半路转码、被面试题里的“数组和链表的区别”问懵过的自学选手这篇都能帮你把脑子里那团“好像听过但说不清”的知识捋顺。没有代码基础的人也能读懂大部分内容因为很多核心思想说白了就是生活中的整理术。1. 数据结构到底在解决什么问题1.1 一个图书馆就是一棵树我把话说得直白一点数据结构研究的是“数据怎么组织才能让增删改查又快又省”。这里的“快”指时间效率“省”指空间开销而“增删改查”这四个字几乎覆盖了所有软件系统的全部操作逻辑。举一个特别贴切的例子图书馆。假如一个图书馆把所有书都按到馆顺序堆在一个大仓库里新书来了直接放在最后面找书就只能一本一本翻——这是极致的“顺序存储”插入快但查找极慢。假如给每本书都编上索书号再按索书号排满书架找书可以用二分法快速定位但中间插入一本新书就得把后面所有书往后挪——这是“有序数组”查找快但插入慢。假如馆里除了书架还备了一套“索引卡”每张卡片写着书名、位置并按书名拼音排好序这就相当于“索引”。再往上图书管理员如果自己脑子里有一张分类图“文学类”下面是“中国小说”“外国小说”“中国小说”下面又有“古典”“现代”那她找书就不需要翻遍全馆只需要顺着分类逐层下钻——这就是“树形结构”。你没发现吗图书管理员的这套检索思路跟你在数据库里查一条记录时索引走过的路径几乎一模一样。所以我才说数据结构不是计算机的专利它是对“如何高效组织信息”这事的系统化总结。1.2 逻辑结构、存储结构与操作的三角关系很多初学者被“数据结构”这四个字迷惑以为它就是“数组、链表、树、图”那些名词的合集。其实科班教材里有个经典的三层框架逻辑结构、存储结构、数据的运算。这三层搞清楚了整门课的主线就抓在手里了。逻辑结构数据元素之间是什么关系。一对一就是线性表一对多是树多对多是图互不相关就是集合。这是站在“用户视角”看数据跟代码怎么存无关。存储结构逻辑结构落到内存里怎么实现。连续一整块空间挨着放叫顺序存储用指针把散落各处的节点串起来叫链式存储另外还有索引存储和散列存储哈希。这是站在“机器视角”看数据。数据的运算针对某种结构定义的操作集合比如线性表的插入、删除、查找树的遍历图的求最短路径。同一个逻辑结构如果底层存储结构不同同一个操作的开销可能天差地别。这三者的关系用一句话概括就是逻辑结构是“设计图”存储结构是“施工方案”运算是“你打算让这栋楼承担什么功能”。教材上经常说的“线性表”“栈”“队列”其实是逻辑结构层面的概念而“顺序表”“链表”则是线性表的两种存储实现。考研和面试最爱考的就是让你辨析这些概念层次别混为一谈。1.3 四个基本逻辑结构一张表说清把逻辑结构压缩到最简就是四个大类。任何复杂的数据组织方式最后都能归到这四类里逻辑结构元素之间的关系典型例子集合同属一个集合再无其他关系一个班级的花名册不分先后线性结构一对一有前驱和后继排队买奶茶的队伍、通讯录树形结构一对多有层级公司组织架构、图书分类、文件目录图形结构多对多任意两个节点都可能有边地铁线路图、社交网络好友关系你注意看我举的例子全是日常生活中能摸到的东西。因为数据结构的本质就是把现实世界的“关系”映射到电脑里再设计对应的操作算法。所以学这门课的时候每当遇到一个新的结构先问一句“这在现实生活中对应什么场景”这个概念你就已经理解了一半。2. 贯穿整个数据结构的核心主线存储选择与复杂度衡量2.1 顺序存储和链式存储一组相爱相杀的老冤家存储结构里最基础、最重要的两个选择就是顺序存储和链式存储。几乎所有数据结构线性表、栈、队列、树、图都有基于这两种存储的实现版本。顺序存储的特点是“逻辑相邻物理也相邻”。数组就是最典型的例子。你要访问第5个元素直接拿首地址加上4个元素大小的偏移量就能算出地址时间复杂度是O(1)这就是“随机存取”。但缺点也明显插入或删除一个元素平均要移动一半的元素而且一整块连续空间可能不够用扩容成本高。链式存储的特点是“逻辑相邻物理不一定相邻”。每个节点除了存数据还要存一个指针指向下一个节点。插入和删除只需要修改指针指向不需要移动数据时间复杂度在已知位置的前提下是O(1)。但你要找第5个元素就必须从头开始一个个跳过去时间复杂度是O(n)这叫“顺序存取”。另外每个节点还要额外存指针空间开销更大。我经常用“火车车厢”类比链表每节车厢只知道自己后面挂着哪节车厢你要找第10节车厢必须从车头一节节数过去。这个类比虽然老但真的管用。实操中的选择原则也很简单读多写少用顺序存储写多读少用链式存储。比如一个经常被遍历、很少被插入删除的配置表用数组一个频繁被插入删除的消息队列用链表。别小看这个判断它在系统设计里天天用得到。2.2 时间复杂度给操作“掐表”的度量衡数据结构离不开算法而算法最核心的度量标准就是时间复杂度。很多非科班自学者看到O(1)、O(n)、O(log n)就头晕其实这玩意的直觉特别简单。时间复杂度描述的是当数据规模n变大的时候你的操作耗时跟着怎么变。注意它不关心具体是跑了1微秒还是2微秒只关心“增长趋势”。O(1)就是无论n多大耗时恒定O(n)就是n翻一倍耗时也翻一倍O(log n)就是n从一千涨到一百万耗时只涨一点点——因为它在“对半砍”地缩小范围比如二分查找。千万别把“log n很慢”理解成“log函数增长慢算法就慢”恰恰相反对数级复杂度是除了常数级以外最优美的复杂度。再给你一个生活中的参照O(n)是你在一堆乱放的快递里翻自己的包裹翻完一半才找到O(log n)是你在一本按姓氏拼音排好的电话簿里查“张”姓每次翻一半定位很快就能翻到O(n²)是全班两两互相握手人一多握手次数暴涨。遇到算法题先算清楚暴力解法的复杂度再想想能不能用更好的数据结构把复杂度降一档——这是刷题最核心的思维模式。2.3 抽象数据类型ADT把“做什么”和“怎么做”分开再讲一个绪论里必提、但你可能是第一次当回事的概念抽象数据类型Abstract Data TypeADT。它描述的是“一个数据结构对外提供什么操作”而不关心“内部怎么实现”。我这么说吧。你去餐厅吃饭菜单上写“宫保鸡丁”你只需要知道这道菜的味道和分量不需要知道后厨用的是哪口锅、火力多大、花生米是炸的还是炒的。ADT就像是菜单栈这个ADT规定了push入栈、pop出栈、top取栈顶这些操作至于底下是用数组实现还是用链表实现用户根本不关心也最好别关心因为一旦内部实现变了用户代码不用改。这背后的价值在工程里非常大。它叫“接口与实现分离”。基于同一个栈ADT我今天用顺序栈明天改链式栈上层逻辑一行都不用动。这也是为什么数据结构课的实验题通常要求你先定义ADT再写实现最后写调用的原因——它在模拟真实项目的分层设计。理解了ADT你再看“为什么会有那么多种数据结构”就不会觉得是知识堆积了每种结构其实是在“特定操作组合”和“特定性能特征”之间的一个妥协方案。3. 一张图看穿数据结构版图经典结构与选型思路3.1 线性结构家族数组、链表、栈、队列、串、哈希表线性结构是数据结构里最庞大、最常用、也是考研和面试出题最多的家族。它们有一个共同点数据元素是一对一的线性关系。但具体到每一种适用场景又各不相同。数组/顺序表随机访问快、缓存友好适合读多写少、大小相对固定的场景。链表插入删除灵活适合频繁增删、大小不可预知的场景代价是访问慢、内存开销大。栈后进先出LIFO的结构。函数调用、括号匹配、浏览器的前进后退、撤销操作全是栈的典型应用。你写代码时的一层一层函数调用就是系统在维护一个调用栈。队列先进先出FIFO的结构。消息队列、打印任务排队、CPU任务调度、BFS广度优先搜索的待访问节点全是用队列实现的。串字符串本质是字符的线性表但因为它太常用了单独成了一类。模式匹配算法KMP、BM是考研大题常客面试也爱问。哈希表通过哈希函数把键直接映射到存储位置实现“平均O(1)”的查找。它是我个人最偏爱的一种结构因为它是“用空间换时间”这个思想的极致体现。后面单独展开讲。这里我必须强调栈和队列不是“简单的数组/链表”它们是一种受限制的线性表。恰恰是这个“限制”让它们的行为变得可预测、可约束才有了各种巧妙的应用。初学者容易犯的错是觉得“栈就是用数组实现嘛”没错但更重要的是“限制只允许在一端操作”这个规则本身带来的设计价值。3.2 哈希表与哈希链从查字典到防篡改哈希表这个结构值得单独拉出来说一说因为它涉及一个热搜词哈希链。很多人第一次听到“哈希”可能是在比特币、区块链的新闻里觉得那是什么高深莫测的东西。但哈希本身是一种极其基础的数据结构技术。先理解哈希表。它的底层思想是不要把数据一个个存好再遍历着找而是通过一个哈希函数把“键”直接换算成一个数组下标达到“存的时候按规则放取的时候按规则拿”的效果。举个例子一个电话本如果按人名首字母建哈希表你查“张三”直接去“Z”分区翻就行不需要从头翻到尾。平均情况下哈希表查找的时间复杂度是O(1)这是线性结构里最顶级的性能。哈希表的代价是什么哈希冲突。两个不同的键算出了同一个下标就撞车了。解决冲突的经典办法有开放定址法和链地址法。链地址法就是让每个数组槽位挂一条链表冲突的元素挂到同一个槽位的链表上——这就是最简单朴素的一种“哈希链”。再来看另一个热搜词“bitcoin数据结构哈希链”。区块链这个名称里的“链”指的就是区块之间通过哈希值链接成一条链每个区块的头部都存了前一个区块内容的哈希值一旦前一个区块的数据被改了一点点它自身的哈希值就会彻底变化后一个区块里存的“前一个区块哈希”就对不上了篡改行为立刻暴露。所以哈希链这个结构本质上就是用哈希值作为指纹把一个个数据块串联起来形成防篡改的链条。它的核心价值不在“链”本身而在“哈希值对内容极其敏感”这个性质。抛开区块链不谈哈希思想在工程里无处不在密码存储要加盐哈希、文件下载要校验MD5/SHA、数据库索引有哈希索引、Redis的字典、Python的dict和set底层全是哈希表。所以不管你是为了面试、考研还是实际开发哈希表都值得你花最多精力去啃透。3.3 树与图从层级关系到多对多网络线性结构之后就是更复杂的非线性结构树和图。树解决的是“一对多”的层级关系图解决的是“多对多”的网络关系。树结构里最常考的是二叉树。为什么是二叉树而不是三叉树、四叉树因为“二叉树易于存储、易于操作”而且任何多叉树都能用“左孩子右兄弟”的方式转成二叉树。二叉树的变体也特别多二叉搜索树BST让查找、插入、删除都能维持在O(log n)平衡二叉树AVL和红黑树解决了BST在极端情况下退化成链表的性能问题堆是一种特殊的完全二叉树能快速找到最大/最小值是优先队列的经典实现。文件系统、数据库索引B树、表达式解析、哈夫曼编码全是树的应用。图结构更复杂一些。图的存储有临接矩阵和邻接表两种方式遍历有深度优先搜索DFS和广度优先搜索BFS最短路径有迪杰斯特拉算法和弗洛伊德算法最小生成树有Prim和Kruskal算法。图论是算法竞赛和面试里最难啃的硬骨头之一但它的实用性也最强地图导航最短路径、社交网络好友推荐、网络流量路由、任务依赖关系的拓扑排序全是图算法的用武之地。我说句实在话树和图这部分光靠“看”是学不会的。你必须亲手写一遍二叉树的遍历亲手用邻接表建一张图再跑一遍BFS看它怎么一层层向外扩散。这个过程会有一点疼但是值得。3.4 面试和考研到底在考什么热搜词里“数据结构面试”和“考研数据结构”占比很高我作为过来人给你提炼一下这两类考试的高频考察逻辑你会发现它们和“数据结构本身”是一回事只是考察视角略有不同。考研数据结构侧重理论基础和手写代码能力。重点在概念辨析逻辑结构与存储结构的区别、经典算法流程快排、归并、KMP、Dijkstra、Prim等、手写基础代码建树、遍历、链表反转、栈操作。王道数据结构系列教材就是把考点按章节梳理得很清楚适合系统复习。但是建议别只背结论要能自己推导复杂度、复现算法过程。大厂技术面试侧重“根据场景选结构”和“手撸代码”。面试官常问的“数组和链表的区别”“栈和队列的应用场景”“哈希表冲突怎么解决”“如何用两个栈实现一个队列”“二叉搜索树和哈希表的优缺点对比”本质上都是在考察你在实际工程里能不能选对数据结构来优化性能。我见过不少候选人基础题背得很熟但一遇到“给一个场景让你选结构并说明理由”就卡壳原因就是只背了定义没理解“为什么”。所以不管是考研还是面试光看资料是不够的一定要“动手写动脑想”。写代码验证你的理解想清楚每个选择背后的权衡这才能真正把知识变成能力。4. 新手怎么学数据结构从“看会”到“写会”的路线图4.1 为什么你“听懂了但不会写代码”我敢说十个人学数据结构有八个卡在同一个地方上课/看书觉得都听懂了一到自己写代码就脑子空白。这个问题的根源不是你不聪明而是你混淆了“理解概念”和“实现能力”两件事。理解“栈是后进先出”只需要三秒钟但实现一个栈需要你选存储结构、定义节点或数组大小、处理边界条件栈空、栈满、写清楚push和pop的每一步指针移动——这中间任何一个细节出错程序就崩。概念是抽象的代码是具体的两者之间的鸿沟必须靠大量代码量来填平。我的建议是每学一个数据结构不要急着去看别人的实现代码先自己拿一张纸画出这个结构在内存里的样子指针怎么指、数组下标怎么走再用代码把它“翻译”出来。画图法特别管用因为数据结构本质上是“关系”而关系最适合用图来表示。如果你画不出图说明你还没理解如果你能画出来但写不出代码说明你只是缺代码练习。这两个问题要分别对症下药。4.2 资料怎么选严蔚敏、王道、大话还有网课热搜词里出现了好几本经典教材《大话数据结构》《数据结构C语言版》严蔚敏《数据结构、算法与应用》C语言描述《王道数据结构》。我聊聊怎么选。《大话数据结构》对纯新手最友好语言轻松、例子很多适合第一遍入门建立概念。缺点是深入度有限。严蔚敏版经典中的经典考研统考和大多数高校都用的教材。C语言描述内容严谨全面但确实有点难啃。适合上课用或第二遍加深理解。《数据结构、算法与应用》C描述偏工程实践代码质量较高适合有C基础、想做项目的人。王道数据结构考研复习利器知识点高度浓缩、题目经典但前提是你已经学过一遍基础直接拿它入门会有点吃力。我的建议是组合拳零基础先用《大话数据结构》或B站的入门网课建立整体印象然后再用严蔚敏版或学校指定的教材配合王道资料系统学习最后用大量练习题和实验报告来检验掌握程度。网课推荐看讲得细、带着写代码的比如B站上一些高校公开课比自己硬啃书效率高很多。4.3 常见学习误区死记代码、只刷题不总结、忽略实验报告最后聊几个我在自学过程中踩过的坑全是血泪教训。第一个误区是背代码。面试和考试最忌讳背题。代码一定是要自己手写推导出来的不是背出来的。就算你把红黑树的插入代码背得滚瓜烂熟面试官换个问法、换个场景你就懵了。真正重要的是理解每一步为什么这么做边界条件为什么这么处理。第二个误区是只刷题不总结。刷题数量不等于掌握程度盲目刷两百道题不如吃透五十道题。每做完一题问自己三个问题这题用了什么数据结构为什么选这种结构时间和空间复杂度是多少然后把这些题按“题型/数据结构”归类形成你自己的知识网络。第三个误区和学生关系最大忽略实验报告。很多高校的数据结构课设和实验报告比如“湖南科技大学数据结构课设”“华农数据结构课程设计”这些热搜词说明大家都被实验报告折磨过。但我想说实验报告的价值不在最后交上去的那个文档而在你写代码、调试、测试、分析复杂度的过程。认真做一次课设胜过看十遍教材。写报告的时候别只贴代码要把设计思路、时间/空间复杂度分析、测试用例设计、遇到的问题及解决方案写清楚——这些才是你真正学会的东西。5. 动手做一个最小实验用代码落地你的第一个数据结构5.1 实验目的和分析思路为了不让你觉得前面全是空谈我在这里提供一个可以做一两个小时、适合入门和交实验报告的小实验实现一个“可自动扩容的栈”分别用顺序存储和链式存储各写一版并对比两者在相同操作序列下的表现差异。这个实验的好处在于它覆盖了数据结构绪论的几乎所有核心概念——逻辑结构栈的LIFO规则、存储结构数组 vs 链表、运算push/pop/取栈顶/判空、时间复杂度分析各操作的复杂度、以及“同一逻辑结构、不同存储实现”的性能差异。实验步骤建议按这个思路走写一个基于数组的顺序栈初始容量设4满了就自动翻倍扩容写一个基于链表的链式栈不对容量做任何限制对两个栈分别执行规模为10万次的随机入栈和出栈操作记下耗时在实验报告里分析为什么顺序栈整体更快链式栈的优势在哪里如果操作序列变成“频繁在中间插入元素”结论会不会变5.2 顺序栈和链式栈的参考实现下面来写核心代码。我用C语言写。#include stdio.h #include stdlib.h #include time.h // 顺序栈 typedef struct { int *data; int top; int capacity; } SeqStack; void initSeqStack(SeqStack *s) { s-capacity 4; s-top -1; s-data (int*)malloc(sizeof(int) * s-capacity); } void pushSeq(SeqStack *s, int val) { if (s-top s-capacity - 1) { // 满了扩容为原来的2倍 s-capacity * 2; s-data (int*)realloc(s-data, sizeof(int) * s-capacity); } s-data[s-top] val; } int popSeq(SeqStack *s) { if (s-top -1) { printf(栈空\n); return -1; } return s-data[s-top--]; } // 链式栈 typedef struct Node { int data; struct Node *next; } Node; typedef struct { Node *top; } LinkedStack; void initLinkedStack(LinkedStack *s) { s-top NULL; } void pushLinked(LinkedStack *s, int val) { Node *newNode (Node*)malloc(sizeof(Node)); newNode-data val; newNode-next s-top; s-top newNode; } int popLinked(LinkedStack *s) { if (s-top NULL) { printf(栈空\n); return -1; } int val s-top-data; Node *tmp s-top; s-top s-top-next; free(tmp); return val; }这段代码不长但它把顺序存储数组扩容和链式存储节点指针的核心差异都体现出来了。顺序栈的扩容用了realloc链式栈每次入栈都要malloc一个新节点这个“内存分配开销”正是两种实现性能差异的一个重要来源。如果你用的是Java、Python这类自动管理内存的语言你更要注意链表节点其实也是一个独立的“对象/节点”频繁创建和释放带来的开销在语言层面被“自动垃圾回收”或“池化”隐藏了但数据量大了之后依然会体现出来。这也就引出了一个重要的工程经验链式结构在理论上有优势但在现代CPU架构和内存管理下顺序结构的“缓存局部性”优势往往更大。这不是数据结构理论错了而是硬件和运行时环境让理论假设变了。5.3 实验报告的规范写法很多学生不知道数据结构实验报告怎么写要么只贴代码要么全是泛泛而谈。我提供一个标准的五段式结构照着填就能拿高分实验目的一句话说清本次实验要掌握的知识点比如“掌握栈的逻辑结构和两种存储实现方式理解顺序存储与链式存储的异同”。设计思路用文字图示说明你选择的存储结构、数据结构定义、关键函数的设计理由。核心代码贴最重要的实现片段不用全贴但核心逻辑必须完整。测试与分析给出测试用例、运行结果并对时间复杂度和空间复杂度做分析。总结与问题写实现中遇到的问题、解决方法、以及“如果不这样实现会怎样”的思考。这部分是区分“抄代码”和“真学会”的关键。写报告的时候有个诀窍把你踩过的坑也写进去。老师看了会觉得你是真做了实验你自己也能在复盘里加深记忆一举两得。6. 常见问题与自学避坑指南6.1 期末复习和考研复习怎么抓重点这两个群体的需求不太一样我分开说。期末复习的话重点是“过一遍概念 刷一遍经典题”。概念方面逻辑结构与存储结构、线性表/栈/队列/树/图各自的特点、查找和排序算法的复杂度这些必考。题目方面把课后习题和往年考题刷一遍尤其是“给定序列构造二叉树/求遍历序列”“手写快速排序/归并排序/堆排序的过程”“哈希表构造与冲突处理”这三大类题型吃透之后期末基本稳了。考研复习建议分三轮第一轮“地毯式”看书理解概念第二轮围绕王道/真题题型强化训练第三轮查漏补缺整套卷模拟。特别提醒考研数据结构的大题往往需要“手写代码”所以平时一定要练习在纸上写代码——不是电脑上跑通就算而是能在白纸上逻辑完整地写出代码这完全是两种能力。6.2 看不懂教材、代码写不出来怎么办这两个问题堪称自学数据结构的两大最常见的“劝退点”。看不懂教材的话绝大多数情况是“姿势”不对。严蔚敏版本文字非常精炼经常一句话藏着好几层意思你要是逐字逐句读越读越晕。我的建议是先“扫读”概念不细究细节把每个名词混个眼熟再重点看图——教材里的示意图往往比文字重要十倍最后回到代码对着图把代码过一遍。遇到看不懂的章节就跳过去先学后面的回头再看往往就通了。代码写不出来最有效的方法只有一个抄代码之后默写。没错第一步先抄抄的时候在心里默默解释每一行在干什么然后合上书凭着记忆和理解自己写一遍。写错了对照答案看是哪里理解出了问题隔一天再默写一遍。这个过程重复三遍你就真的会了。这个方法听起来笨但它是我见过的最有效的“从看到会”的跨越方式。6.3 关于“数据结构与算法”的关系和语言选择热搜词里“数据结构与算法”频繁出现很多初学者对这两者的关系也容易迷糊。我简单说清楚数据结构是“数据的组织形式”算法是“解决问题的步骤”。两者互为表里。数据结构是算法的载体算法是数据结构的灵魂。你定义一个“图结构”然后用BFS算法在图上找最短路径这就是两者的结合。所以“数据结构与算法”通常被合起来说因为脱离开数据结构的算法是不可实现的脱离算法的数据结构是无意义的。至于语言选择C语言是考研和科班的首选C和Java在面试中更常见Python则适合快速验证思路和刷题。我的建议是如果是为了考研或打扎实基础跟紧学校指定语言一般是C或C如果是为了面试和项目实践用你最有把握的语言把核心数据结构撸一遍。语言只是工具数据结构的思想才是根。这里还想多说一句我自己的体会很多人纠结用哪种语言学我觉得这完全是个伪问题。你见过哪个用Python学数据结构的人面试时因为用Python答链表题被挂掉的面试官看的是你的思路和代码质量不是语言本身。与其纠结语言不如赶紧动手写起来。6.4 数据结构的真正价值是一把“思维的尺子”最后分享一个我在实际工作中才真正想明白的点数据结构这门课教的并不只是“一大堆结构”它教的是一种衡量方案优劣的思维方式。我做了这么多年开发回头看大学里学的那些具体结构很多已经直接用不上了——你不会在业务代码里手写红黑树也不会有机会去实现一个B树。但那些在绪论课里就埋下的思维模式——顺序还是链式用空间换时间还是用时间换空间平均复杂度更优还是最坏复杂度更优——这些问题我在做系统设计、性能优化、数据库选型的时候几乎每天都会用到。数据结构像一把尺子它让我在设计任何方案的时候都会习惯性地量一量时间、空间、复杂度然后选择一个更优的折中。学的时候觉得枯燥用了之后才知道真香。有人说“数据结构是程序员的内功”我深以为然。你写第一行代码的时候感觉不到它但当你写的程序要面对百万级、千万级的数据时它就是你跟普通程序员拉开差距的地方。希望这篇“绪论”看完你能对这门课有一个整体的框架感——知道自己要学什么、为什么学、怎么学。剩下的路就靠你一行一行代码去走出来了。
返回列表