如何学习数据结构与算法
学习数据结构与算法一个很重要的前提,就是至少熟练掌握一门编程语言。至于是那种语言就无关紧要了,C 语言、C++、Java、Python 等语言都可以。因为无论是数据结构还是算法,它教会我们的是解决问题的思想,并不挂靠某一门具体的编程语言。换句话说,在掌握任何一门编程语言的基础上,都可以学习数据结构和算法。
数据结构与算法的关系
大量数据结构教程中都将数据结构的知识和算法掺杂起来讲,使很多初学者认为数据结构就是在讲算法,这样理解是不准确的。如果把程序理解为:
程序=数据+算法
那么数据结构用于解决数据存储问题,而算法用于处理和分析数据,输出结果。
在解决问题的过程中,数据结构要配合算法选择最优的存储结构来存储数据,而算法也要结合数据存储的特点,用最优的策略来分析并处理数据,可以最高效地解决问题。
数据结构与算法的重要性
假设需要从众多数据中查找出符合要求的元素,美学没学习数据结构的话,只能借助数组这种简单的存储结构来实现,而通过学习数据结构,解决此类问题既可以通过构建二叉排序树、平衡二叉树、红黑树、B+/B- 树甚至借助哈希表解决。不同数据结构选择往往直接影响程序性能好坏。
掌握了数据结构与算法,看待问题的深度、解决问题的角度会大有不同,对于个人逻辑思维的提升,也是质的飞跃。与编程语言不同,无论是 c 语言、Java、Python、C++、PHP 还是其他编程语言,无时无刻不在更新迭代,而数据结构却永远不会过时,毋庸置疑,数据结构是每个程序员必须掌握的基本功。
要想学好数据结构,不仅要求学员具备良好的编程基础,还需具有较强的逻辑分析能力、理解能力和一定的空间想象能力,可以这么说,能玩转数据结构的人,其综合实力往往都不差。很多大的互联网公司,更看重的往往不是你精通多少种编程语言,而是综合能力,也就是解决问题的能力。可见,数据结构与算法是能力高低的分水岭,是大厂选拔人才的重要标准。
学习数据结构的三部曲
书
比如《算法图解》、《我的第一本算法书》、《啊哈算法》、《大话数据结构》、《漫画算法-小灰的算法之旅》、《算法(第 4 版)》、《数据结构与算法分析》、《挑战程序设计竞赛》以及《算法导论》等等。
如果要比较系统地学习数据结构的话,推荐看《大话数据结构》、《算法(第 4 版)》和《数据结构与算法分析》。
大话数据结
算法(第 4 版)
据结构与算法分析
如果刚接触数据结构的话,可以从《算法图解》、《我的第一本算法书》入手。
算法图解
我的第一本算法书
视频
郝斌数据结构
虽然比较老,但是讲的比较详细,容易理解,对初学者非常友好。
https://www.bilibili.com/video/BV1Ut411a7rN?from=search&seid=14411767501116137153
数据结构-浙江大学
课程是由陈越与何钦铭共同录制,b 站与慕课网都有,慕课网比较清晰一些
https://www.icourse163.org/course/ZJU-93001?from=searchPage
https://www.bilibili.com/video/BV1JW411i731?p=1
数据结构与算法基础
课程由青岛大学王卓老师录制,非常适合考研,讲的题比较多。
https://www.bilibili.com/video/BV1nJ411V7bd?p=1
多动手
动手去做,动手去做,动手去做。重要的话说三遍。
动手包括撸码,还包括"多画"
要边学习边画图。因为对于数据结构中的存储结构来说,尤其是树结构和图结构,存储结构确实比较复杂,仅靠空间想象难免会有披露,而通过亲手画图往往能避免很多“坑”,后面关于数据结构与算法的文章中,我也会加入一些动图。
把数据结构图形化,视觉化。在直觉上感受一个数据结构是什么样子的。使用它是什么感觉,抽象上和具体实现上是什么样子的。这就是最重要的事情。并且无论是对于简单的队列、栈还是平衡树都很重要而且有效。把数据结构画出来,在你的脑袋瓜里面就能想象出来,总之,你需要做的就是,直观的去了解这些数据结构。
在学习某些算法时,也可以借助画图来加深自己的理解。可以边阅读代码边画图,这样可以更快理清代码的实现逻辑。
在通过“多画”实现理解存储结构和实现逻辑的基础上,初学者还要“多撸码”编写实现代码。对于某一种存储结构或者算法,没有 3 遍以上自己独立的实现过程,是很难做到融会贯通的。
另外,可以在 leetcode 和牛客网多刷题。
思维导图
来源:https://blog.csdn.net/ityqing/article/details/82838524
分享一本由谷歌大佬所撰的《LeetCode 算法题解+代码》
里面包含了详细的题目分析+详细代码答案且已开源,可作为刷题的辅助和参考,格式为 PDF,方便阅读,也方便打印出来学习。
需要上面 PDF 文档,在公众号(c 语言与 cpp 编程)回复 「刷题」 两个字自取。
为防止不加原址的转载,特注明原作出处 https://github.com/soulmachine/leetcode
评论