✅作者简介:大家好,我是新小白2022,让我们一起学习,共同进步吧!
个人主页:新小白2022的CSDN博客
系列专栏:算法基础入门
如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦
算法学习打卡
第一章 字符编码分类(算法基础一)
第二章 双飞本科学习动力,方向(算法基础二)
第三章 零基础入门算法应该学些什么(算法基础三)
第四章 小项目实战(通讯录管理系统)
第五章 项目实战自我总结
第六章 快捷键操作(单行/多行注释)
第七章 随机种子与随机数(冷知识)
第八章 谁的大学不迷茫?计算机相关专业该怎样度过?
第九章 致新手——计算机考研都需要准备什么?
第十章 作为程序员,是什么让你坚持不懈地学习?
目录
系列文章目录
前言
一、什么是数据结构与算法
二、学习的重点在什么地方?
三、切勿盲目刷题:刷题前的知识积累
1、提高数据结构与算法没啥捷径,最好的捷径就是多刷题。
2、AC不是目的,我们要追求完美
3、挑战自己,跳出舒适区
4、再说数据结构重要性
三、从0基础小白,到ACM亚洲区域赛金牌
1、知识轮廓
2、学一门基础的程序设计语言
3、选择一本适合自己的参考书
4、刷题实践
5、如何正确做一道题
从简入手
优化
构思代码
写代码
Debug
总结与反思
总结
这篇文章不是让你成为大神的,学完也不是多厉害,而是,给处于大学迷茫、不知道学啥的你,一个学习的方向,无论你是否是科班。不过我相信,当你看完这些,你应该会有自己的学习方向。
1、程序 = 数据结构 + 算法,足以看出他们的重要性,但感觉平时编程没有刻意用到他们,其实这只是感觉,代码的字里行间无不在使用。
一个常见的心理路程就是:
开始学习时,感觉他们没什么用,平时敲代码也用不到,没有在代码里刻意设计过
学习一段时间,发现以前写代码都在悄悄的用到,然后开始刻意按照规则设计代码
时间久了,又感觉没有用到了,其实是在下意识的用了,只是用的时候没有刻意贴上“数据结构与算法”的标签
2. 算法
操作数据的一组方法。
算法的设计取决于逻辑结构,算法的实现依赖于存储结构。
3. 数据结构与算法
数据结构是为算法服务的,算法要作用在特定的数据结构之上。无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。
提到数据结构和算法,很多人就很头疼,因为这里面的内容实在是太多了。这里,我就帮你梳理一下,应该先学什么,后学什么。你可以对照看看,你属于哪个阶段,然后有针对地进行学习。
想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析。
这个概念究竟有多重要呢?可以这么说它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓!必须要拿下,并且要搞得非常熟练。否则后面的数据结构和算法也很难学好。
为了让你对数据结构和算法能有个全面的认识,从优秀博客这里找了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点!
作为初学者,或者一个非算法工程师来说,你并不需要掌握图里面的所有知识点。
很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。我还是那句话,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力。
总结了20个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这20个知识点就足够了。
这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。
但是,刷题的前提是你要先学会一些基本的数据结构与算法思想。(优秀博客分享连续三年刷题)
千万别指望以为自己把基础思想学完之后刷题会很牛,只有多刷题,只有多动手实践,你的灵敏度才会提高起来。
在做题的时候,一定要追求完美,千万不要把一道题做出来之后,提交通过,然后就赶紧下一道。我认为这意义不大,因为一道题的解法太多了,有些解法态粗糙了,我们应该要寻找最优的方法。
在做题的时候,要力求一题多解,如果自己实在想不出来其他办法了,可以去看看别人是怎么做的,千万不要觉得模仿别人的做法是件丢人的事。衡量一道算法题的好坏无非就是时间复杂度和空间复杂度,所以我们要力求完美,就要把这两个降到最低,令他们相辅相成。
我想不到这些方法啊,怎么办?那么你就可以去看别人的做法,之后,遇到类似的题,你就会更有思路,更知道往哪个方向想。
什么叫舒适区?在刷题的时候,可能有一类题是你比较懂的,你每次一看就有思路,然后半个小时就撸好代码,提交代码,然后通过了,然后,哇,又多刷了一道题,心里很舒服。
但是,记住,前期你可以多刷这种题练手,提升自己的乐趣,但,我还是建议你慢慢跳出舒适区,去做一些自己不擅长的题,并且找段时间一直刷这种题。例如我觉得我在递归方面的题还是挺强的
但是,我对动态规划的题,很菜,每次都要想好久,每次遇到这种题都有点害怕,没什么信心。不过有段时间我觉得只刷动态规划的题,直接在 leetcode 选定专题,连续做了七八十道,刚开始很难受,后来就慢慢知道了套路了,一道题从两三个小时最后缩到半小时,简单的十几分钟就搞定。感觉自己对这类型的题也不惧怕的。
所以,建议你,一定要学好跳出自己的舒适区
前面我主要是说了我平时都是怎么学习算法的。在数据结构方法,我只是列举了你们一定要学习链表和树(二叉堆),但这是最基本的,刷题之前要掌握的,对于数据结构列举一些比较重要的:
1、链表(如单向链表、双向链表)。
2、树(如二叉树、平衡树、红黑树)。
3、图(如最短路径的几种算法)。
4、队列、栈、矩阵。
对于这些,自己一定要动手实现一遍。你可以看书,也可以看视频,新手可以先看视频,不过前期可以看视频,之后我建议是一定要看书。
例如对于平衡树,可能你跟着书本的代码实现之后,过阵子你就忘记,不过这不要紧,虽然你忘记了,但是如果你之前用代码实现过,理解过,那么当你再次看到的时候,会很快就记起来,很快就知道思路,而且你的抽象能力等等会在不知不觉中提升起来。之后再学习红黑树啊,什么数据结构啊,都会学的很快。
优秀博主分享
首先我们要在大脑中初步建立算法与数据结构知识的结构,有助于我们后面学习到某一块知识,可以知道我们当前的学习的知识属于哪个模块,进而在脑中对知识点进行分类和总结,对后续的刷题和学习都十分帮助。
这里推荐学习 C++/Java/Go/Python。这几个是目前比较主流的语言,如果你已经会其中的一种,学习算法与数据结构就够了。
会的意思是指: 会题目要求的基础的输出和输出,了解语言基础的语法,可以根据题目要求,能用语言实现自己的思路。
注意一点,如果目标是在学习算法和数据结构,不要对语言的细节进行过分的深入,耽误过多时间。只要会基本的语法可以实现算法的思路就可以了。
初学者从简入手,选择一本薄、相对容易、看得进去的书,建立学习算法的信心。
这里推荐几本得到很多好评的两本书。
《算法红宝书第四版》
对每一个算法知识点讲得都很详细,同时不是很繁琐,比较容易上手。
《图解算法》
图例很多,语言通俗易懂,学起来比较有意思。
《算法导论》
大家小学的时候肯定都有字典或工具书。
我们就可以把《算法导论》当做工具书来使用,在学完了基本的算法与数据结构,大家想对某一个知识深入学习或者复习的时候,这个时候可以查一查《算法导论》。
纸上得来终觉浅,绝知此事要躬行!
对于算法和数据结构,最好的检验学习成果的方式,就是刷题!
所以推荐大家学习一个知识点后,去刷一点对应知识点的题目巩固和加深一下理解。
有的时候一下想到时间复杂度最低的解法是很难的,就像一口吃不成胖子。
所以我们可以先从简单暴力(时间复杂度高)的方法入手,可以发现一些题目的线索,为后面想到时间复杂度最低的方法打下基础。
思考如何在第一步的基础上,如何优化算法,这里可以学习常见优化的算法与数据结构来降低时间复杂度。比如: 哈希表、二分算法、动态规划等
有了以上两步,我们此时应该已经有了一个正确的想法,此时我们应该构思代码,有那几部分,每部分实现什么功能,代码怎么写。而不是直接闷头去写代码,因为很多时候没想清楚,直接去写代码,会导致写了一半发现思路不对,之前写的代码前功尽弃。
实现第三步代码,写代码的时候要专注,写完要自己先检查一遍有没有手误,防止自己想的和写的不一致,最后写一个简单的样例,测试一下代码是否可以通过。测试通过了就可以提交啦。
如果代码通过了,可以直接看下一步。
如果我们的题目没有通过,应该检查代码是不是有bug、思路对不对。
有的时候肉眼看不出的时候,可以出几组复杂的测试样例,看看自己的代码是否可以输出正确的结果,若不能的话,可以根据样例看代码哪里有问题。
题目通过了,我们应该总结一下这道题考察的知识点、切入的角度、同类型的题目等,还要思考有没有更优的办法,代码还能不能更加简洁一些。
做到以上几点,一道题的就学习的很透彻了,遇到同类型的题目也可以举一反三。
知识需要沉淀,不要想试图一下子掌握所有。在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。永远记住学习知识的过程是反复迭代、不断沉淀的过程。
这句话是不是不太完整?学习知识的过程是反复迭代、不断沉淀、乐于分享的过程!
多谢前辈优秀文章!!!
1、时间复杂度(优秀博客)
2、如何正确学习数据结构、算法这门课?(应试)
3、连续三年刷题(经验)
4、 从小白到ACM金牌大神