入门篇|学渣是如何自学数据结构的?

戳蓝字“CSDN云计算”关注我们哦!


640?wx_fmt=png


作者 |  小鹿

来源 |  一个不甘平凡的码农


   写在前边

-------------------------------------------

今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。写这篇文章主要目的还是重在让刚刚接触数据结构的读者按照总结方法进行阶段性学习。

 

目前在读三流大学,之所以为学渣,在刚学编程初期,真的是比别人慢半拍,总是遇到各种迷茫和困惑,控制台遇到各种错误总是希望有个人解决一下就好了,但是现实往往打你一个嘴巴子,睡一觉回过头来还是自己硬着头皮去解决,我相信大多数初学者都有这样的疑惑。


但是到了后来,自己更注重于追求学习方法和学习效率,不过现在还是学渣,因为真正的大佬是无所畏惧的,我能做的只不过是帮助一些编程道路上的人解除困惑,提高一下学习效率。互联网、编程技术更新换代太快了,如果不具备高效的学习方法和学习效率会被时代落下的,所以从今天开始重视学习方法和效率的,在未来的互联网你会变的越来越有价值和存在感。


大学的三年时间基本在自学编程,老师的态度就是我也懒得讲,课上能说废话尽量说些废话,期末给你们考试范围就好了,以后就业面试和我一点关系都不挂钩,无论你毕业不毕业对我没有任何影响。在那时,我决定好好学习编程,大部分时间都是来自学,包括上课干自己的事情。


同样的一门技术,有没有想过为什么有人学的快,运用的快,后来发现并不是笨导致的,不要一直责怪自己不适合这不适合那,一开始我也是这么想的,但是现在完全适合编程这种高强度的学习了。


今天主要分享一下学习数据结构正确的方式,我并不能保证适用于每一个人,但是我能保证比你盲目的去刷题,去随便弄本书看效率高的多,那就从下边这几个方面入手吧,那就是动机、目标、实践、反馈、提高标准

 

   我的基础

-----------------------------------

说起没有学习数据结构之前的基础,说起来有点丢人,只知道数组,而且是 C 语言中的数组,数组下标取值、遍历等操作,可别笑话我菜,但是这半年来一步步摸索,终于知道数据结构在解决实际问题中的重要性了,分布式、高并发系统的性能优化,都离不开数据结构,希望这篇文章不仅能分享给你学习数据结构的方法,也希望你能爱上数据结构。

 

   我的学习动机

-----------------------------------

学习一门技术首先要有动机。那什么是动机呢?我们经常看到减肥的人通常在房间里放一张好身材的图片,就是为了产生动机每天坚持减肥。学习也是一样的,没有动机就没有的学习下去的动力。那我学习数据结构的最初动机是什么呢?快实习了,想让自己找一家好的公司实习,没有数据结构与算法的基础不可能进入一家理想的公司的,所以我将进入一家理想的公司作为学习的动机。

 

   我的收获

-----------------------------------

经过大三上半年对数据结构的自学,和以前那个自己相比有了质的飞跃,从最基础的某一数据结构的由来、是什么,特点以及优缺点到实际项目中应该如何运用,再到如何培养自己下意识的数据结构(遇到问题,根据问题的特性就能下意识的想到用哪个数据结构来解决)。到后来逐渐的学会了将多种数据结构联系起来进行解决问题,这样做的目的就是能够让程序性能更加稳定,效率更加高效。

 

这些都是这半年来每天和数据结构打交道不断的训练出来的,这半年基本没有一天放松过,就连除夕晚上都在做算法,研究数据结构。功夫不负有心人,即使基础再不好,头脑再笨,通过我总结的学习方法也能学好数据结构。

 

   我的实践

-----------------------------------

因为我上的是一所三流大学,大多数时间靠自学,总结了很多的提高学习效率的方法,那么在学习数据结构上我是怎么做的呢?我将数据结构的学习分为了三个阶段。

 

第一阶段:认识数据结构

 

第一步:学习它就应该知道数组、链表、栈、队列、散列表、跳表、图、树、堆、字典树10种数据结构用来干什么,为什么,怎么做 ,小鹿建议去看一些基础的数据结构书籍或者借助百度和谷歌简单了解一下每种数据结构用来干什么,为什么,怎么做就可以了,然后可以简单做一下笔记和博客。

 

第二步:每种数据结构都有它的优缺点和性能的好坏,那我们以什么标准来衡量数据结构与算法的性能好快呢?那第二步就学习时间复杂度、空间复杂度相关的复杂度分析的内容 ,这部分内容至关重要,因为后边要学到的数据结构与算法都要有一个衡量性能标准的,为了能够不同的问题解决选择出性能最优的数据结构和算法。

 

第二阶段:深入数据结构

 

第一步:写代码。上边最基本的十种数据结构相关特性和使用条件都做笔记了,然后我们从头开始对每种数据结构进入深入研究,首先数据结构涉及到的操作,比如增、删、改、查等操作要自己实现一遍,在机器上运行一遍,写代码的时候一定要注意以下几点:边界条件、指针、代码的规范。

 

这样会使你更加的对代码有颗敬畏之心,每次写代码都要认真对待,如果机器上写代码没问题了,可以自己通过在笔记本上用笔手写亲自实现一遍,有利于你加深你的代码逻辑的理解。

 

第二步:在第一阶段中我们了解到性能的衡量标准,那下一步就再回过头来对 10 种最常用的几种数据结构涉及到的操作进行性能分析。你可能会问,为什么不边写代码边进行性能分析呢?


我觉得分阶段的好处就是能集中解决问题,写代码就是要锻炼写代码的思维逻辑能力,性能分析就是要提高自己的分析能力,性能分析完成之后再看一下之前写的代码有哪些可以进行优化改进的。这期间你会遇到各种问题,遇到问题怎么做,我通常会去百度或者谷歌借助别人写的文章进行总结记录到笔记本上。

 

第三步:每种数据结构的性能分析完成之后,再进行对每种数据进行深入。第一阶段我推荐的是看一些基础的书籍,涉及到的知识层次不深。但是我们还是要至少手中有一本具有权威性深入解析的数据结构书籍才能对一些概念进行深入的理解。基础书籍毕竟是让你入门的嘛,我们可以通过这些权威性高、内容全面的对已学到的数据结构知识点进行查缺补漏。

 

第四步:单独的深入学习真的很枯燥杂么办,那么我们就实际生活中的例子去分析,比如猜数字游戏、0/1背包问题、走迷宫、八皇后问题以及满减凑单问题等。如猜数字游戏,我们可以想想怎么才能在最短的时间内猜到正确的数字呢,可能你会想到使用二分查找。那好了,我们问一下自己二分查找存在的问题,这个过程中一定要多问自己为什么,只有这样你的知识层次才会得到扩展,比如二分查找如果数据中有重复数据怎么解决?

 

我还是要强调一下,一定要多问自己为什么,因为从心理学上来讲,人的大脑符合最小阻力原则,就是思考的事情最不喜欢做,所以这里我们要逆着来,才能进一步进行突破。如果你觉的上述两个阶段没有问题了,我们就进行下面的第三个阶段检索数据结构。

 

第三阶段:检索数据结构

 

第一步: 这时你可能学的非常多的关于数据结构的内容,但是很难运用,那怎么能够在实际实际问题中运用起来呢?我们前边已经将零碎的知识点整理到笔记本上了?接下来该怎么做呢?我们可以借助思维导图,对知识体系化整理,无论是复习巩固都利于我们进一步加强。

 

第二步:上述整理成体系之后完毕之后,然后去谷歌或者百度搜索一下有明确解决方案的实际问题拿来进行分析学习,你到这些实际项目中会发现,很多问题涉及到多个数据结构问题,我们前边解决的还不过是针对单一的数据结构,那就尝试着自己将数据结构之间建立联系。


比如数组和链表,每种数据结构都有优缺点,你在学习的过程中你会发现一个数据结构的优点正是另一数据结构的缺点,数组在内存空间是连续的,对CPU缓存友好,而链表在内存中是零碎内存空间,对CPU缓存不友好,但是链表可以动态扩容而数组不可以。

 

再比如为了提高程序的效率不得不用消耗更多的内存空间的数据结构去代替另一数据结构,如果内存紧张,对执行效率要求不高的话,我们又用省内存执行效率稍有不高的数据结构去代替占内存大而执行快的数据结构。

 

第三步:学会将实际问题转换成所学的数据结构 。怎么转化呢?如:假如你是一名工程师,要对链表实现缓存的算法进行优化你会怎么解决?我们先将问题转换成学过的数据结构,里边提到链表,好那我们知道有链表了,在分析用链表实现了那些操作?淘汰数据、查找数据、缓存数据,这三个操作里边都涉及到查找,我们不得不遍历整个链表,时间复杂度为O(n)。

 

那我们就想能不能对查找进行优化呢?根据问题或者数据的特征找适用的数据结构,缓存的三个操作涉及到快速的插入、删除、查询数据,我们在大脑中快速的检索可以快速的实现插入、删除、查询的数据结构有哪些?平衡二叉树、散列表、跳表等,比如我们选择散列表,最后分析一下时间复杂度是不是优化了很多,否则我们再换另一种数据结构进行性能分析。


我们不难发现,实际问题就会一步一步的分解成了我们学习到的数据结构的基本操作分析,然后利用我们学到的数据结构的优缺点和性能分析得出最优解绝方法,但是在企业中遇到实际问题中往往比我们拿一些做练习的实际问题复杂的要多。

 

   后记

-----------------------------------

上述是我学习数据结构的三个阶段,如果你完成了上述的三个阶段,我还是建议将最基本的10个数据结构重新巩固复习一遍,在巩固和复习的三个阶段中需要不断的反馈和提高标准,我相信你会发现每一个知识点都会有新的收获。

 

640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

  • 如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招

  • 趣挨踢 | “菜鸟”程序员和“大神”程序员的差别竟然这么大...

  • 女生适合做程序员吗?

  • Kubernetes 调度器实现初探

  • 李沐团队新作Gluon,复现CV经典模型到BERT,简单好用 | 强烈推荐

  • 日本乐天要求员工学编程,AI 进中小学课堂,全民编程时代来了!

  • 做了四年以太坊核心开发者, 以太坊升级了, 我也该离开了……


640?wx_fmt=png喜欢就点击“在看”吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt下简单的文件读取

此示例只是一个简单的文件的打开&#xff0c;读取&#xff0c;文件内容的加载&#xff0c;望共勉。 界面效果展示 代码实现 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>namespace Ui { class Dialog; }class Dialog : public QDialog {Q_OBJECTpub…

趣挨踢 | 用大数据扒一扒蔡徐坤的真假流量粉

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;AlfredWu 转自&#xff1a; Alfred数据室前段时间央视新闻公开披露流量明星数据造假。作为一名数据猿&#xff0c;我们秉着好奇心点开了NBA新春贺岁形象大使蔡徐坤的微博&#xff0c;发现他的微博转发量除了最新一条…

Windows OpenGL ES 图像曝光度调节

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 转场 零基础 OpenGL ES 学习路线推荐…

C++中析构函数

析构函数&#xff1a; 1.析构函数不能被重载&#xff1b; 2.析构函数可以是虚函数&#xff1b; 3.析构函数没有参数&#xff0c;没有返回值&#xff1b; 4.当类对象的生命周期结束&#xff0c;系统会自动调用析构函数&#xff1b; 5.若没有显式的析构函数&#xff0c;系统会调用…

Jenkins进阶系列之——07更改Jenkins的主目录

Jenkins进阶系列之——07更改Jenkins的主目录 参考链接&#xff1a; https://blog.csdn.net/pansaky/article/details/80749567 Jenkins默认会存放在用户主目录下的.jenkins文件夹中 如&#xff1a;Linux root用户&#xff1a;/root/.jenkins 注意&#xff1a;这是linux版本的…

Windows OpenGL 图像曝光度调节

目录 一.OpenGL 图像曝光度调节 1.原始图片2.效果演示 二.OpenGL 图像曝光度调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Op…

kubernetes精华问答 | Swarm和K8S的共同点有哪些?

kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kubernetes提供了应…

The server quit without updating PID file

The server quit without updating PID file (/usr/local/var/mysql/bogon.pid) 今天网站web页面提交内容到数据库&#xff0c;发现出错了&#xff0c;一直提交不了&#xff0c;数找了下原因&#xff0c;发现数据写不进去&#xff01;第一反应&#xff0c;重启mysql数据库&…

开发者如何快速精简容器云镜像?| 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;阿木接触过容器云或者用过容器的同学一般都会遇到容器镜像占用空间很大的问题&#xff0c;遇到此类问题的时候大部分同学可能更加习惯于为容器的镜像仓库增加磁盘空间&#xff0c;当然这种方式无可厚非&#xff0c;…

Linux环境 Jenkins集成构建SonarQube

参考链接&#xff1a; https://www.linuxhub.org/?p4450 https://blog.51cto.com/damaicha/2118766 https://max.book118.com/html/2019/0107/8067110025002000.shtmJenkins集成构建SonarQube 一、前提准备 应用服务器apache-tomcat-9.0.20.tar.gzjenkinsjenkins.warmysql版…

Windows OpenGL ES 图像对比度调节

目录 一.OpenGL ES图像对比度调节 1.原始图片2.效果演示 二.OpenGL ES 图像对比度调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基…

dubbo之.xml配置文件报错

【dubbo之.xml配置文件报错】Multiple annotations found at this line: - cvc-complex-type.2.4.c: The 异常现象&#xff1a; 1.dubbo配置xml文件报错 “Multiple annotations found at this line:- cvc-complex-type.2.4.c: The matching wildcard is strict, but no decl…

验证电脑的字节序

字节序的分类 大端字节序&#xff1a;低地址存高位&#xff0c;高地址存底位&#xff0c;网络字节序又叫大端端字节序&#xff1b; 小端字节序&#xff1a;低地址存地位&#xff0c;高地址存高位&#xff1b; 验证示例 记录2个示例来说明电脑采用的大端字节序还是小端字节序…

刚刚出新的Kubernetes 却曝出了“高危”安全漏洞;亚马逊将推免费新闻视频服务,对标苹果 | 极客头条...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 被宣布取消的AirPower&#xff08;图片来源网络&#xff09;【4月1日 星期一】云の声音5G最极致的应用领域应该是8K电视。——富士康科技集团副总裁、富士康企业大学创校校长 陈振国…

Maven实战手册

一、maven的作用&#xff1a; 1.1jar包的统一依赖管理&#xff0c;节省空间1.2项目的一键构建 二、Maven能做什么&#xff1f; 2.1编译 测试(junit) 运行 打包 部署 三、Maven的安装配置署 3.1下载安装3.2 官网链接&#xff1a;http://maven.apache.org/download.cgi 3.3下…

Windows OpenGL 图像对比度调节

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 转场 零基础 OpenGL ES 学习路线推荐…

大端字节序与小端字节序的转换

逐步加深对字节操作的理解&#xff0c;记录一下大端字节序与小端字节序的转换&#xff0c;开发环境是vs2010&#xff0c;项目类型是控制台输出程序&#xff0c;下面是代码实现&#xff1a; // ByteOrder_demo.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h&q…

2019年技术盘点微服务篇(一) | 程序员硬核评测

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;孙浩峰过去几年来&#xff0c;“微服务架构”方兴未艾&#xff0c;尽管这种架构风格没有确切的定义&#xff0c;但我们已经看到许多项目凭借此架构取得了积极的结构&#xff0c;因此对于许多开发者来说&#xff0c;…

虚拟化精华问答 | 虚拟化的关键技术有哪些?

在实际的生产环境中&#xff0c;虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用&#xff0c;透明化底层物理硬件&#xff0c;从而最大化的利用物理硬件。今天就让我们一起来看看关于虚拟化的精华问答吧。1Q&#xff1a;什么是虚拟化&#xf…

idea工具拉取GitHub远程代码

需求&#xff1a;idea工具拉取GitHub远程代码&#xff1a; 项目代码地址&#xff1a; gitgithub.com:gb-heima/createNewProject.git可以先进行test测试连接情况&#xff1a;