网站建设补助,wordpress 动态特效,莆田网站建设方案服务,广州网站开发平台文章目录前言1. 数据结构与算法是什么#xff1f;2. 为什么数据结构与算法很难#xff1f;3. 如何系统学习数据结构与算法#xff1f;#x1f351; 复杂度#x1f351; 线性表#x1f351; 树形结构#x1f351; 图#x1f351; 排序#x1f351; 字符串#x1f351;…
文章目录前言1. 数据结构与算法是什么2. 为什么数据结构与算法很难3. 如何系统学习数据结构与算法 复杂度 线性表 树形结构 图 排序 字符串 跳表与哈希表 总结4. 学前勉言前言
提到数据结构与算法就一定会伴随着诸多所谓的坚持和抱怨。同时还有两个词总是出现一个是内功是对知识的定位一个是吃透是对自己的期待。可是我们是不是被这两个词束缚太久了以至于出现了很多的问题
时间不多数据结构与算法的知识体系庞大总是学了后面忘了前面很难坚持。刷了不少题但面对面试官的提问和新的题目我总是没有思路。代码细节总是写不对环境、语言都可能成为我的 “绊脚石”。书上的东西看是看懂了但到底要怎么实践 我个人觉得其实真正的原因是你没有找到好的学习方法没有抓住学习的重点。实际上数据结构和算法的东西并不多常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法学起来并没有看上去那么难更不需要什么高智商、厚底子。
1. 数据结构与算法是什么
从广义上讲数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 图书馆储藏书籍你肯定见过吧为了方便查找图书管理员一般会将书籍分门别类进行 “存储”。按照一定规律编号就是书籍这种 “数据” 的存储结构。 那我们如何来查找一本书呢有很多种办法你当然可以一本一本地找也可以先根据书籍类别的编号是人文还是科学、计算机来定位书架然后再依次查找。笼统地说这些查找方法都是算法。 从狭义上讲是指某些著名的数据结构和算法比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶我们可以直接拿来用。我们要讲的这些经典数据结构和算法都是前人从很多实际操作场景中抽象出来的经过非常多的求证和检验可以高效地帮助我们解决很多实际的开发问题。
那数据结构和算法有什么关系呢为什么大部分书都把这两个东西放到一块儿来讲呢
这是因为数据结构和算法是相辅相成的。数据结构是为算法服务的算法要作用在特定的数据结构之上。 因此我们无法孤立数据结构来讲算法也无法孤立算法来讲数据结构。
比如因为数组具有随机访问的特点常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构二分查找算法就无法工作了因为链表并不支持随机访问。
数据结构是静态的它只是组织数据的一种方式。如果不在它的基础上操作、构建算法孤立存在的数据结构就是没用的。
现在你对数据结构与算法是不是有了比较清晰的理解了呢有了这些储备下面我们来看看数据结构与算法的难点在哪儿吧。
2. 为什么数据结构与算法很难
第一个问题都说这部分知识是内功一定要不断修炼保证吃透可是何为内功何为吃透
有人把学习数据结构与算法比喻为练内功但我不赞成这样的说法。程序员真正的内功其实是解决复杂问题的全局把控能力以及细节实现能力这往往需要十数年甚至数十年的持续修炼才能体会得到。除非你将所有计算机基础知识都称为内功否则这样的比喻并不恰当。
不可否认的是数据结构和算法方面的知识是计算机的基础知识之一但是这不意味着你一定要给它贴上一个宏大的标签甚至扛着极大的心理压力和包袱去学习。
数据结构和算法方面的知识博大精深深入挖掘下去还会用到许多数学知识。因此我们的首要目标不应该是吃透而应该是尝一尝把知识读薄指向实践够用即可。后续要在某个非常具体的数据结构或者算法领域取得一定成就才会需要吃透其中的一些东西。
第二个问题怎么分配系统学习和刷题的时间呢
有一句话很重要做选择之前要明白自己到底想要什么。
刷题基本都是为了应付面试。如果非要说是为了锻炼解决问题的思维能力以及快速用合适的数据结构去解决现实中的问题这个作用当然也有但却是次要的。对于软件工程师来讲还有很多比数据结构更重要的知识需要去学会。
如果你确定要去某个大厂应聘某个算法岗而该算法岗是需要你刷题的那么你就在系统学习之后在网上找找相关的试卷或者考题有目的地到 LeetCode 上去刷。
如果你不去大厂或者并不去应聘一些专门的算法岗职位那么直接去系统学习一门课就好。把时间节省出来好好学些更重要的知识吧。切记时间对于软件开发工程师非常非常珍贵甚至是你最珍贵的资源、最宝贵的财富。千万不要大手大脚的占用大量时间去学习太多没必要的知识。
一言以蔽之也就是没有孰重孰轻但 系统的学习是刷题的基础。想象一下你会在不认识汉字的情况下去读小说吗
越是大而全越要删繁就简卸下了包袱明确了目标接下来的问题就是怎么学习了。
很多同学感觉到自己的时间有限数据结构和算法知识体系太过庞大学了后面忘了前面很难坚持学完。造成这种情况的原因很多比如有些资料把简单问题复杂化了有些资料则非常晦涩数学知识过多学术性过强甚至是表达不清很难让人有舒适的学习体验。
不论你是否已经具备了一定的基础接下来就让我们放平心态先来梳理下在每个模块的学习目标到底是什么。
3. 如何系统学习数据结构与算法
为了让大家对数据结构和算法能有个全面的认识我画了一张图里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。 复杂度
数据结构和算法解决的是如何更省、更快地存储和处理数据的问题因此我们就需要一个考量效率和资源消耗的方法这就是复杂度分析方法。
所以如果你只掌握了数据结构和算法的特点、用法但是没有学会复杂度分析那就相当于只知道操作口诀而没掌握心法。只有把心法了然于胸才能做到无招胜有招
因此复杂度分析这个内容一定要花大力气来啃必须要拿下并且要搞得非常熟练。否则后面的数据结构和算法也很难学好。 线性表
学习任何知识都要由浅入深由易到难。线性表会是本专栏讲解的第一个数据结构和其它结构相比它更为简单直接也最好理解从代码实现上也最容易是学习其他更复杂数据结构的基础。同样也一定能让你对之后的学习更有信心。 树形结构
不过在一些复杂的领域中线性表这种简单的数据结构还不足以表达问题这个时候树形结构就出现了。
它是算法面试中最常出现的数据结构也是在实际开发中我们经常会有意无意用到的数据结构想要写出正确且更高效的程序代码这部分的内容还是要打好基础的。 图
图是比树形结构更复杂的数据结构。如果说树形结构的应用往往体现在程序编写中那么对图的应用往往更接地气更体现在实际生活中。
比如可以通过图来解决找出两个城市之间如何行走距离最短、最节省时间、花费的金钱最少问题等等还可以用图来估算一个工程能否按顺序进行以及估算该工程需要的最短时间。 排序
我们知道数据结构是为算法服务的。所以在讲解完线性表、树形结构、图这三种数据结构后我们正式进入到算法知识的讲解中。
在各种算法知识中尤其以排序算法最经典实用且在面试中最常出现。排序算法有十数种每种排序算法的适用场合、时间以及空间复杂度、稳定性等各不相同搞定了这部分的内容也就可以应付面试了。 字符串
这种数据结构非常常见同时也有着广泛的应用比如在搜索引擎中搜索的关键词、在文章中需要过滤的敏感词等等都属于字符串。
其中最需要解决的问题是子串在整个字符串中的查找问题。主要介绍两种查找子串的算法实现方式。第一种实现方式称为朴素模式匹配算法容易理解但执行效率相对较低第二种是 KMP 模式匹配算法这种算法执行效率很高但理解起来却颇有难度。
尤其值得注意的是有些面试官非常喜欢考 KMP 模式匹配算法实现的子串查找这里的重要程度也就不言而喻了。 跳表与哈希表
跳表与哈希表这两种数据结构都非常实用且有趣味性可以理解成是属于更高级的数据结构范畴。不过放心虽然高级但代码实现上却没有那么复杂。
你可以把跳表看作强化版的线性表可以极大提升元素查询速度。而哈希表是对数组的扩展对于查找操作同样有非常良好的性能表现。引入这两个话题一是为了丰富你的眼界和开发思路以备在日后的开发中随时采用二来也是避免不了的老调重弹 —— 为了应付面试的需要。 总结
作为初学者或者一个非算法工程师来说你并不需要掌握上图里面的所有知识点。很多高级的数据结构与算法比如二分图、最大流等这些在我们平常的开发中很少会用到。所以你暂时可以不用看。咱们学习要学会找重点。如果不分重点地学习眉毛胡子一把抓学起来肯定会比较吃力。
所以只要集中精力逐一攻克这下面知识点就足够了。
10 个数据结构数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树10 个算法递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法再学更加复杂的数据结构和算法就会非常容易、非常快。
学习数据结构和算法的过程是非常好的思维训练的过程所以千万不要被动地记忆要多辩证地思考多问为什么。如果你一直这么坚持做你会发现等你学完之后写代码的时候就会不由自主地考虑到很多性能方面的事情时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。
4. 学前勉言
前面划了学习的重点也讲了学习这门课需要具备的基础。现在我就给你分享一下本专栏 「数据结构」 学习的一些技巧。掌握了这些技巧可以让你化被动为主动学起来更加轻松更加有动力
边学边练适度刷题多问、多思考、多互动打怪升级学习法知识需要沉淀不要想试图一下子掌握所有
在学习的过程中一定会碰到 拦路虎。如果哪个知识点没有怎么学懂不要着急这是正常的。因为想听一遍、看一遍就把所有知识掌握这肯定是不可能的。学习知识的过程是反复迭代、不断沉淀的过程。
因此我特别希望这个专栏 「数据结构」 不仅能帮你抛下身上对于数据结构与算法的沉重包袱更能潜移默化地为你打开思维建立数据结构与算法的敏感度为之后的每一次实战打下坚实的基础。
要记住数据结构与算法本来就是一件小事。