【算法基础三】算法如何入门?零基础入门算法应该学些什么?_算法入门-程序员宅基地

技术标签: 算法  c++  数据结构  算法与数据结构  

作者简介:大家好,我是新小白2022,让我们一起学习,共同进步吧!
个人主页:新小白2022的程序员宅基地
系列专栏:算法基础入门
如果觉得博主的文章还不错的话,请点赞+收藏️+留言支持一下博主哦

 系列文章目录

   算法学习打卡

第一章  字符编码分类(算法基础一)

第二章   双飞本科学习动力,方向(算法基础二)

第三章   零基础入门算法应该学些什么(算法基础三)

第四章  小项目实战(通讯录管理系统) 

第五章 项目实战自我总结

第六章  快捷键操作(单行/多行注释) 

第七章  随机种子与随机数(冷知识)

第八章   谁的大学不迷茫?计算机相关专业该怎样度过?

 第九章   致新手——计算机考研都需要准备什么?

 第十章  作为程序员,是什么让你坚持不懈地学习?


目录

 系列文章目录

前言

一、什么是数据结构与算法

二、学习的重点在什么地方?

三、切勿盲目刷题:刷题前的知识积累

 1、提高数据结构与算法没啥捷径,最好的捷径就是多刷题。

 2、AC不是目的,我们要追求完美

 3、挑战自己,跳出舒适区

 4、再说数据结构重要性

三、从0基础小白,到ACM亚洲区域赛金牌

 1、知识轮廓

 2、学一门基础的程序设计语言

 3、选择一本适合自己的参考书

 4、刷题实践

 5、如何正确做一道题

从简入手

优化

构思代码

写代码

Debug

总结与反思

总结


前言

这篇文章不是让你成为大神的,学完也不是多厉害,而是,给处于大学迷茫、不知道学啥的你,一个学习的方向,无论你是否是科班。不过我相信,当你看完这些,你应该会有自己的学习方向。


一、什么是数据结构与算法


1、程序 = 数据结构 + 算法,足以看出他们的重要性,但感觉平时编程没有刻意用到他们,其实这只是感觉,代码的字里行间无不在使用。

一个常见的心理路程就是:

开始学习时,感觉他们没什么用,平时敲代码也用不到,没有在代码里刻意设计过
学习一段时间,发现以前写代码都在悄悄的用到,然后开始刻意按照规则设计代码
时间久了,又感觉没有用到了,其实是在下意识的用了,只是用的时候没有刻意贴上“数据结构与算法”的标签

2. 算法
操作数据的一组方法。

算法的设计取决于逻辑结构,算法的实现依赖于存储结构。

3. 数据结构与算法
数据结构是为算法服务的,算法要作用在特定的数据结构之上。无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

二、学习的重点在什么地方?

提到数据结构和算法,很多人就很头疼,因为这里面的内容实在是太多了。这里,我就帮你梳理一下,应该先学什么,后学什么。你可以对照看看,你属于哪个阶段,然后有针对地进行学习。

想要学习数据结构与算法,首先要掌握一个数据结构与算法中最重要的概念——复杂度分析

这个概念究竟有多重要呢?可以这么说它几乎占了数据结构和算法这门课的半壁江山,是数据结构和算法学习的精髓!必须要拿下,并且要搞得非常熟练。否则后面的数据结构和算法也很难学好。

为了让你对数据结构和算法能有个全面的认识,从优秀博客这里找了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点!

作为初学者,或者一个非算法工程师来说,你并不需要掌握图里面的所有知识点。

很多高级的数据结构与算法,比如二分图、最大流等,这些在我们平常的开发中很少会用到。所以,你暂时可以不用看。我还是那句话,咱们学习要学会找重点。如果不分重点地学习,眉毛胡子一把抓,学起来肯定会比较吃力

总结了20个最常用的、最基础数据结构与算法,不管是应付面试还是工作需要,只要集中精力逐一攻克这20个知识点就足够了。

这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;

10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考多问为什么。如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。你的编程内功就真正得到了修炼。

三、切勿盲目刷题:刷题前的知识积累

 1、提高数据结构与算法没啥捷径,最好的捷径就是多刷题。

但是,刷题的前提是你要先学会一些基本的数据结构与算法思想(优秀博客分享连续三年刷题)

千万别指望以为自己把基础思想学完之后刷题会很牛,只有多刷题,只有多动手实践,你的灵敏度才会提高起来。

 2、AC不是目的,我们要追求完美

在做题的时候,一定要追求完美,千万不要把一道题做出来之后,提交通过,然后就赶紧下一道。我认为这意义不大,因为一道题的解法太多了,有些解法态粗糙了,我们应该要寻找最优的方法。

在做题的时候,要力求一题多解,如果自己实在想不出来其他办法了,可以去看看别人是怎么做的,千万不要觉得模仿别人的做法是件丢人的事。衡量一道算法题的好坏无非就是时间复杂度空间复杂度,所以我们要力求完美,就要把这两个降到最低,令他们相辅相成。

我想不到这些方法啊,怎么办?那么你就可以去看别人的做法,之后,遇到类似的题,你就会更有思路,更知道往哪个方向想。

 3、挑战自己,跳出舒适区

什么叫舒适区?在刷题的时候,可能有一类题是你比较懂的,你每次一看就有思路,然后半个小时就撸好代码,提交代码,然后通过了,然后,哇,又多刷了一道题,心里很舒服。

但是,记住,前期你可以多刷这种题练手,提升自己的乐趣,但,我还是建议你慢慢跳出舒适区,去做一些自己不擅长的题,并且找段时间一直刷这种题。例如我觉得我在递归方面的题还是挺强的

但是,我对动态规划的题,很菜,每次都要想好久,每次遇到这种题都有点害怕,没什么信心。不过有段时间我觉得只刷动态规划的题,直接在 leetcode 选定专题,连续做了七八十道,刚开始很难受,后来就慢慢知道了套路了,一道题从两三个小时最后缩到半小时,简单的十几分钟就搞定。感觉自己对这类型的题也不惧怕的。

所以,建议你,一定要学好跳出自己的舒适区

 4、再说数据结构重要性

前面我主要是说了我平时都是怎么学习算法的。在数据结构方法,我只是列举了你们一定要学习链表树(二叉堆),但这是最基本的,刷题之前要掌握的,对于数据结构列举一些比较重要的:

1、链表(如单向链表、双向链表)。

2、树(如二叉树、平衡树、红黑树)。

3、图(如最短路径的几种算法)。

4、队列、栈、矩阵。

对于这些,自己一定要动手实现一遍。你可以看书,也可以看视频,新手可以先看视频,不过前期可以看视频,之后我建议是一定要看书。

例如对于平衡树,可能你跟着书本的代码实现之后,过阵子你就忘记,不过这不要紧,虽然你忘记了,但是如果你之前用代码实现过,理解过,那么当你再次看到的时候,会很快就记起来,很快就知道思路,而且你的抽象能力等等会在不知不觉中提升起来。之后再学习红黑树啊,什么数据结构啊,都会学的很快。

三、从0基础小白,到ACM亚洲区域赛金牌

优秀博主分享

 1、知识轮廓

首先我们要在大脑中初步建立算法与数据结构知识的结构,有助于我们后面学习到某一块知识,可以知道我们当前的学习的知识属于哪个模块,进而在脑中对知识点进行分类和总结,对后续的刷题和学习都十分帮助。

 2、学一门基础的程序设计语言

这里推荐学习 C++/Java/Go/Python。这几个是目前比较主流的语言,如果你已经会其中的一种,学习算法与数据结构就够了。

会的意思是指: 会题目要求的基础的输出和输出,了解语言基础的语法,可以根据题目要求,能用语言实现自己的思路。

注意一点,如果目标是在学习算法和数据结构,不要对语言的细节进行过分的深入,耽误过多时间。只要会基本的语法可以实现算法的思路就可以了。

 3、选择一本适合自己的参考书

初学者从简入手,选择一本薄、相对容易、看得进去的书,建立学习算法的信心

这里推荐几本得到很多好评的两本书。

《算法红宝书第四版》

对每一个算法知识点讲得都很详细,同时不是很繁琐,比较容易上手。

《图解算法》

图例很多,语言通俗易懂,学起来比较有意思。

《算法导论》

大家小学的时候肯定都有字典或工具书。

我们就可以把《算法导论》当做工具书来使用,在学完了基本的算法与数据结构,大家想对某一个知识深入学习或者复习的时候,这个时候可以查一查《算法导论》。

 4、刷题实践

纸上得来终觉浅,绝知此事要躬行!

对于算法和数据结构,最好的检验学习成果的方式,就是刷题!

所以推荐大家学习一个知识点后,去刷一点对应知识点的题目巩固和加深一下理解

 5、如何正确做一道题

从简入手

有的时候一下想到时间复杂度最低的解法是很难的,就像一口吃不成胖子。

所以我们可以先从简单暴力(时间复杂度高)的方法入手,可以发现一些题目的线索,为后面想到时间复杂度最低的方法打下基础。

优化

思考如何在第一步的基础上,如何优化算法,这里可以学习常见优化的算法与数据结构来降低时间复杂度。比如: 哈希表、二分算法、动态规划等

构思代码

有了以上两步,我们此时应该已经有了一个正确的想法,此时我们应该构思代码,有那几部分,每部分实现什么功能,代码怎么写。而不是直接闷头去写代码,因为很多时候没想清楚,直接去写代码,会导致写了一半发现思路不对,之前写的代码前功尽弃。

写代码

实现第三步代码,写代码的时候要专注,写完要自己先检查一遍有没有手误,防止自己想的和写的不一致,最后写一个简单的样例,测试一下代码是否可以通过。测试通过了就可以提交啦。

Debug

如果代码通过了,可以直接看下一步。

如果我们的题目没有通过,应该检查代码是不是有bug、思路对不对。

有的时候肉眼看不出的时候,可以出几组复杂的测试样例,看看自己的代码是否可以输出正确的结果,若不能的话,可以根据样例看代码哪里有问题。

总结与反思

题目通过了,我们应该总结一下这道题考察的知识点、切入的角度、同类型的题目等,还要思考有没有更优的办法,代码还能不能更加简洁一些。

做到以上几点,一道题的就学习的很透彻了,遇到同类型的题目也可以举一反三。


总结

知识需要沉淀,不要想试图一下子掌握所有。在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。永远记住学习知识的过程是反复迭代、不断沉淀的过程

这句话是不是不太完整?学习知识的过程是反复迭代、不断沉淀、乐于分享的过程!

多谢前辈优秀文章!!!

1、时间复杂度(优秀博客)

2、如何正确学习数据结构、算法这门课?(应试)​​​​​​ ​​​​​

3、连续三年刷题(经验)

4、 从小白到ACM金牌大神 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_63943626/article/details/126217739

智能推荐

Dijkstra最短路径算法(针对加权有向图)_liujianfeng1984-程序员宅基地

文章浏览阅读5.2k次。indexMinPQ.h#ifndef _INDEX_MIN_PQ_H_#define _INDEX_MIN_PQ_H_#define INDEX_MIN_PQ_TEST 0typedef struct{ int index; double cmpNum;} INDEX_MIN_PQ_DATA;typedef struct{ int _liujianfeng1984

25.WEB安全基础知识一 网站基础知识_web安全中网站基础是指什么-程序员宅基地

文章浏览阅读1.5k次。1、网站基础知识01 网站访问过程域名->ip->服务器-服务器上的网站网站->浏览器02 网站的基础组成部分html(超文本标记语言):定义页面的内容div+css(层叠样式表):定义页面的布局javascript(js脚本语言):处理页面的动作03 网站类型静态网站:没有程序语言而且没有数据库、不可进行交互、后缀多为html/htm/shtml。动态网站:程序语言、逻辑语言、有数据库、可交互、而且后缀多为php/asp/aspx/jsp/伪静态html等。 _web安全中网站基础是指什么

卧槽!你竟然连SpringBoot中的线程池都不会用。。。-程序员宅基地

文章浏览阅读468次。点击上方蓝色“java大数据修炼之道”,选择“设为星标”每晚九点: 技术干货 ???? 必定奉上哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你..._springboot线程池 线程名前缀不起作用

cesium自定义的弹窗 Popup弹窗(可随球放大缩小,移动)_cesium popup-程序员宅基地

文章浏览阅读1.2w次,点赞30次,收藏140次。# 效果图中效果源代码在下面的封装栏中# 基本思路添加一个鼠标左键点击事件,当鼠标点击时,利用vue2.0中 Vue.extend() 动态添加一个dom元素,将DOM元素渲染到cesium容器中,并利用cesium中提供的 viewer.scene.postRender 实时更新坐标位置。思路很简单,接下来我们进行实现。# 实现方法 1. 首先我们需要生成一个球体做我们标记的容器。viewer = new Cesium.Viewer('cesiumContainer',{ _cesium popup

相机相关参数及视野计算_相机视野大小怎么计算-程序员宅基地

文章浏览阅读2.1w次,点赞12次,收藏62次。CCD尺寸就是靶面尺寸,一般是以英尺为单位,是靶面的斜边长。像素尺寸一般以毫米或微米为单位,是靶面的长和宽。以以下参数为例:监测标志物像素按以下公式计算:Di=fDr/Zdx,其中Di为标志物所占像素直径,f为焦距,Dr为标志物直径,Z为实际距离,dx为每一个像素在x方向的物理尺寸。依据上图,算例一:假设焦距200mm,标志物直径1000mm,实际距离500000mm。dx已知为0.0025mm/pixel,则Di=2001000/5000000.0025=160个像素,即标志所占160个像素。算._相机视野大小怎么计算

多元线性回归,岭回归,lasso回归(具体代码(包括调用库代码和手写代码实现)+一点点心得)_多元线性回归代码-程序员宅基地

文章浏览阅读3.8k次,点赞11次,收藏53次。最近数据挖掘导论老师布置了一项作业,主要就是线性回归的实现,笔者之前听过吴恩达的线性回归的网课,但一直没有进行代码的实现,这次正好相对系统的整理一下,方便各位同学的学习,也希望能够对其进行优化,优化的点最后再说。笔者写这篇博客也为了给实验报告打底稿,各位小伙伴2021年9月30号提交报告的时候别跟我实验报告一样啊,打回的话苦的是自己人,到时候我直接一波举报,哈哈哈。不过,发表这篇文章笔者是真的希望给没有实现的同学提供一点小小的帮助或者提供一点小小的想法。一.实验指导书:数据挖掘实验指导书数据预处_多元线性回归代码

随便推点

ARC 107 解题报告 A.数学(多项式相乘的性质)B(枚举、计算贡献)C(思维、并查集)D(DP(非整数转化)E(打表找结论)F(网络流不会))_arc107-程序员宅基地

文章浏览阅读128次。A - Simple Math题目:求∑a=1A∑b=1B∑c=1C\sum_{a=1}^{A}\sum_{b=1}^{B}\sum_{c=1}^{C}a=1∑A​b=1∑B​c=1∑C​的值ll a,b,c;ll inv2;ll solve(){ ll res=((a+1)*a%mod*inv2%mod)%mod; res=((res*(b+1)%mod)*b%mod*inv2%mod)%mod; res=((res*(c+1)%mod)*c%mod*inv2%mod)%mod; re_arc107

中山纪中游记Day12+8.12模拟赛题解-程序员宅基地

文章浏览阅读126次。Part.I 游记今天的题真的难。。。第一题似乎可以用线段树乱搞,然后我就敲了个线段树上去。和暴力拍了将近40分钟后我确定它已经是正确的然后我就交了。结果考完后发现我开数组时开小了。。。于是100→30…QAQ。。。第二题直接打的暴力。。。结果打T了。。。半分也没有。。。第三题勉强拿到了人口普查的分QAQ。。。woc 如果我第一题拿满的话我就rank 2了。。。Part.II 题解...

RTC定时开机闹钟-程序员宅基地

文章浏览阅读856次。  RTC是Real Time Clock的简称,它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继续工作.  HWCR (Hibernate Wakeup Control Register)是一个控制休眠唤醒的寄存器,如果我们要使用休眠状态下RTC唤醒的功能,我们需要打开它的第0位ELAM(RTC Alarm Wakeup enable),当ELAM置1..._rt-186闹钟

linux图形界面装mysql_ubuntu 安装图形界面-程序员宅基地

文章浏览阅读169次。安装基本图形界面:apt-get install xorg gdm ssh你可以用/etc/init.d/gdm start 测试是否成功.一般是肯定成功的,所以你可以不用试了,然后再用’Ctrl + Alt + F1′.切换出去,因为我们还有很多东西要继续安装Gnome桌面:apt-get install gnome-session gnome-menus gnome-panel metacit..._tango-icon-theme

萧子术的第一道编程算法题_算法题:鹏鹏很喜欢吉他,老师让他进行拨琴弦-程序员宅基地

文章浏览阅读94次。标题:用java实现 给定一个整数数组 nums 和一个整数目标值target,请你在该数组中找出 和为目标值的那两个 整数,并返回它们的数组下标。你可以假设每种输入只**会对应一个答案。**但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。大家好!我是 萧子术 这是我第一次写博客。以下内容将记录并督促自己每天写一道算法题。加油~奥利给!``2021年1月16日,地点:家里 天气:阴天这是第一道题目题目内容:给定一个整数数组 nums 和一个整数目标值target,请你在该数组_算法题:鹏鹏很喜欢吉他,老师让他进行拨琴弦

策略模式_为什么策略模式查出来的对象 放进list中会被覆盖-程序员宅基地

文章浏览阅读2.4k次。策略模式定义了算法族,这些算法被分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。 这是《深入浅出设计模式》对策略模式的定义,这个定义说得很准确,但是书中的示例却举得不好,让我对策略模式的理解总是“一会儿感觉理解了,一会儿感觉没有理解”。直到看了《Effective Java》第二版第21条,用函数对象表示策略,才终于只是处于“感觉理解了”的状态了。根据自己的理解,写了_为什么策略模式查出来的对象 放进list中会被覆盖