作者|慕课网精英讲师liuyubobobo
本文首发于「慕课网」,想要获取更多IT干货内容和程序员圈内热闻,欢迎关注!
在学习算法和数据结构的过程中,时间管理显得尤为重要。如果你的时间特别紧张,直接刷题当然是一个快速的方法。如果你有相对宽裕的时间并且希望真正夯实算法和数据结构的基础,那么深入了解经典的算法和数据结构的底层原理是你不可忽视的一环。
我们来探讨一下这些底层原理包括哪些内容。它们主要包括各种排序算法、二分搜索法、线性数据结构如动态数组、链表、栈和队列等。还包括常用的树形数据结构如二分搜索树、堆、红黑树、B树以及并查集等。哈希表和常用字符串算法如Trie的使用、滚动哈希、KMP等也是重要的一部分。基础的图论算法,如深度优先遍历、广度优先遍历、Dijkstra算法、Kruskal算法等也是必须掌握的。除此之外,还有一些进阶的数据结构和图论算法,如线段树、后缀树、跳表等。
尽管这个列表看起来可能有些枯燥,但这些都是计算机科学领域中最基础的内容,对于深入理解算法和数据结构至关重要。这些基础知识的掌握不仅是刷题的基础,更是继续深入计算机科学其他领域的关键。
再谈谈KMP算法,这本书以自动机的形式展现其奥秘,但鲜为人知的是,KMP算法其实还有更简洁的实现方式,那就是通过被称为LPS数组的“最长适当前缀后缀”来实现。遗憾的是,《算法4》对此并未提及。
尽管存在这一小小的遗憾,《算法4》依然是一本璀璨的明珠,它是学习经典算法和数据结构底层实现的最佳指南。对于新手来说,这本书同样友好,有Java语言基础的同学可以毫无障碍地阅读。
第二章,我们踏入Leetcode的刷题世界。这里与经典算法和数据结构的学习有所不同,更加注重算法设计的实践。在这里,你很少会遇到要求你从头实现一个哈希表或一个快速排序的问题,因为大家都倾向于直接使用语言的标准库。如何利用这些经典算法和数据结构解决实际问题,这里面的学问可就大了。
除了这些,算法设计领域还有许多问题是学习经典算法和数据结构的底层实现时难以系统接触的。例如动态规划、分支限界等,都是极具价值的算法设计思想。还有一些基础的算法或数据结构的应用,在学习底层实现时也不会涉及。以栈为例,虽然它的底层实现简单,但我们可以利用其特性,巧妙地解决一些问题。如利用单调栈的思想,解决区间的最大最小值问题,或离线解决RMQ问题。
说到系统学习算法设计,我强烈推荐这本《Algorithm Design Manual》。在疫情期间,出版社Springer甚至免费提供了其英文原版供大家下载。如果你喜欢中文版本,国内也有引进。
但值得注意的是,算法设计是一个极其广泛且没有具体边界的领域,因此没有一本书能够涵盖所有问题。特别是为了面试准备的同学,刷题依然是不可或缺的部分。
那么,该如何刷题呢?我个人的建议是,按照Leetcode为大家提供的专题顺序进行。在力扣中文站上,“学习”标签下总结了各个专题,同学们可以根据自己的兴趣或弱点进行选择。我可以给大家一个基本的参考顺序:数组和字符串、数组类算法、栈和队列、链表、二分查找、堆、递归、二叉树、二分搜索树、N叉树、前缀树、哈希表、查找表类算法、深度优先、广度优先、动态规划1和2等等。这些专题的问题已经相当丰富,如果都能熟练解决并深入理解,相信面试中的算法问题就不再是难题。
同学们可以根据自己的时间和掌握情况灵活调整专题的顺序。当觉得自己对某一专题已经比较熟悉时,就可以进入下一个专题的学习。
最后来到第三章,关于Leetcode竞赛。从面试准备的角度来看,仅仅按照专题进行刷题是不够的。因为在实际面试中,问题往往没有标签提示,这就需要我们全面而灵活地掌握各类问题的解决方法。例如,对于某些问题,可能很难直接想到用动态规划或二分搜索来解决,但如果知道了这一点,问题就迎刃而解。
我们也必须注意到,力扣周赛中的一些问题,特别是那些被标记为 Hard 的问题,正逐渐偏向竞赛性质。这类竞赛性质的问题在面试中出现的概率实际上非常低。对于大多数算法面试来说,如果你在周赛中能稳定解决三道问题,就已经足够了。
如果你对 Hard 级别的问题感兴趣,我建议在力扣平台上寻找那些题号靠前的 Hard 问题。这些问题相对会“简单”一些,也更“标准”,更有可能在面试过程中遇到。相较之下,新近出现的 Hard 问题,特别是在最近一年的 Leetcode 周赛中,更倾向于竞赛性质。
如果你对竞赛问题充满热情,那么去学习和挑战它们是很好的。如何深入学习和训练算法竞赛,那就另当别论了。
我会在适当的时候再次与大家分享我的见解。如果觉得我分享的内容有帮助,不妨【转发】并【点赞】。大家加油,共同努力!
欢迎关注「慕课网」。在那里,你可以发现更多 IT 圈的优质内容,分享干货知识,助力你成为更优秀的程序员。
文章来自《钓虾网小编|www.jnqjk.cn》整理于网络,文章内容不代表本站立场,转载请注明出处。