我并非计算机科班出身,以前只对C、java、Matlab、Python语言有粗略的了解,以前写代码的时候只会考虑功能能实现就行了,并不考虑性能方面的问题,对数据结构与算法从未学习过,更不了解什么时间复杂度、空间复杂度。写代码的时候从不考虑这些。而这一次我想修炼下编程的内功—好好学习下数据结构与算法。

1. 以前对数据结构与算法的困惑

我们以前对数据结构与算法一般都会有如下几点困惑,我简单罗列下:

(1) 在学校中觉得数据结构与算法很难、然后一直也没认真学。错过了最佳学习时光

(2) 工作后,遇到数据结构的坑时,我们一般都是嗤之以鼻,绕过去。功能实现了就行

(3) 面试时,当面试官问数据结构算法的问题时,总是一脸懵逼,各种被吊打

(4) 研究开源源码时,有时候跟不上别人的节奏,甚至都看不懂,各种泪流满面

…等等…

上面的几点困惑,或许大多数IT同胞都遇到过吧。所以好好学习下数据结构与算法还是很有必要的。

2. 为什么要学习数据结构和算法

或许有很多人认为,在实际工作中很少用到数据结构和算法,只要知道API的调用,能熟练的用开源框架,代码照样可以写的很6,是不是就不用系统性的去学习数据结构和算法呢?其实不是这样的,下面我就说几点要学好数据结构和算法的理由。

2.1 大厂面试必备

很多大公司,比如Google、Facebook、BAT、头条等。在面试的时候喜欢叫你现场写代码、考算法。有的人技术很牛,但最终在算法那关没通过,很是可惜。

刚毕业时,参加校招时,由于学生大多都没啥实际项目经验,所以公司比较喜欢考学生的基础知识,问的最多的就是数据结构和算法。

2.2 高效的阅读源码

平时我们在研究一些优秀的开源代码时,如果你能弄清楚它的底层原理,你就能更好的使用它,即使出现了问题,也能快速的定位。因此学好数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是很有用的。

2.3 写出开源代码

同样的功能,每个程序员可能写出来的代码都不一样,但有的人能在Github上开源出来,作为轮子让很多人使用,但有的人却在不停的bug中挣扎。开源出来的代码,一般都具有可读性好、扩展性好、数据存取效率高、节省内存、性能好等特点。这就是编程内功不同导致的。

2.4 不被轻易淘汰

或许这点说的有点大,但程序员35岁或许真的容易陷入瓶颈期(暂时我还没法亲自体验,毕竟我还算年轻,哈哈。。。)。从我公司里的一些老程序员,我也能感觉到。在我周边的老程序员,有点真的很优秀,能cover住很多项目上的疑难杂症,但也有一些老程序员基本不coding了,就干一些无关紧要的活。看到这些,有时我真的有点慌。。。所以只能持续的学习了。

我认为内功强的人,不管是做当前的编程工作还是以后跨领域干其他行业,我认为应该都会做的很好,从而不会轻易被行业淘汰。

学好数据结构和算法,看待问题的深度,解决问题的角度会完全不一样的。就相当于张无忌学会了九阳神功后,然后再去学乾坤大挪移就会快很多。站在巨人的肩膀上,行走江湖,所向披靡。。。

…and so on …

3. 如何系统高效地学习数据结构与算法

3.1 数据结构和算法的定义:

广义上的定义:

数据结构:一组数据的存储结构。算法:操作数据的一组方法。

比如:图书馆中的书籍一般都会按照一定规律进行“存储”,这可以理解为是书籍这种数据的存储结构。当我们去图书馆借书的时候如何找到自己想借的书呢?方法有多种:你可以一本一本的查找;也可以按照书籍类别进行定位查找。这些查找的方法都是算法。

狭义上的定义:

通过前人的智慧结晶,已经规范定义好的数据结构和算法,也就是我们即将要学习的数据结构和算法。

比如:堆、栈、队列、二分查找、动态规划等。这些都是前人从实际工作场景中实践总结出来的,可以高效地帮我们解决很多实际开发中的问题。

3.2 数据结构和算法的关系

其实数据结构和算法是相辅相成的。数据结构是为算法服务的,算法要作用在特定的数据结构上。

比如:数组具有随机访问的特点,常用的二分查找法需要用数组来存储数据。但如果我们使用的是链表这种数据结构,那么就不能使用二分法进行查找了,因为链表不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构是没有任何意义的。

3.3 数据结构和算法的核心概念—复杂度分析

想要学好数据结构和算法,必须要深刻的理解“复杂度分析”这个概念

数据结构和算法的根本目的就是解决如何更省、更快地存储和处理数据的问题。因此我们需要一个衡量效率和资源消耗的方法,而这个方法就是复杂度分析方法!!!复杂度分析就相当于武侠小说中的内功心法。

3.4 数据结构和算法的知识图谱

下面是一张比较全面的数据结构和算法的知识图谱:

当然学习数据结构和算法并不需要掌握图谱上的所有知识点,我们只需要学习里面的10个数据结构:数组、链表、堆、栈、队列、图、散列表、二叉树、Tire树、跳表。10个算法:二分查找、搜索、递归、排序、贪心算法、哈希算法、回溯算法、分治算法、动态规划、字符串匹配算法。掌握了这些基础的数据结构和算法,然后再去学其他更复杂的数据结构和算法就会容易很多。

3.5 学习数据结构和算法的几点建议

(1) 边学边练、适当的刷题

学习大多数知识,我们一般都要遵循input—>thinking—>output的步骤。所以建议先学习、再思考、最后总结。

(2) 多想、多问、多交流

学习也讲究知其然知其所以然,学习算法要多思考,最好能与厉害的人交流

(3) 青铜到王者的升级心态

学习数据结构和算法时,我们要摆正心态,遇到问题时,先思考,后百度、Google。一下子成不了王者,争取每天都增加自己的经验值、战斗力。在枯燥的学习过程中,我们要一点点的升级,要不然很难坚持下来。

以上就是我在修炼编程内功—数据结构和算法之前的一点感想和总结。希望今后与大家共同进步!

学习数据结构和算法前瞻相关推荐

  1. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  2. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  3. 02如何抓住重点,系统高效地学习数据结构与算法?

    以下内容总结自极客时间王争大佬的<数据结构与算法之美>课程,本文章仅供个人学习总结. 什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法 ...

  4. 如何抓住重点,系统高效地学习数据结构与算法?

    你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书.正是这个原因,让很多初学者对这门课望 ...

  5. 数据结构与算法深入学习_我最喜欢的免费课程,用于深入学习数据结构和算法...

    数据结构与算法深入学习 by javinpaul 由javinpaul Data structures and algorithms are some of the most essential to ...

  6. 为什么我要现在复习学习数据结构和算法

    前言   最近人工智能,深度学习特别的火,做为一个软件开发者来说,我们应该对行业形势保持足够的敏感度,同时面对变化我们结合自身情况找准自己的学习方向. 我对人工智能有着极大的兴趣   说实话作为一个开 ...

  7. 我是如何学习数据结构与算法的?

    数据结构与算法的地位对于一个程序员来说不言而喻.今天这篇文章不是来劝你们学习数据结构与算法的,也不是来和你们说数据结构与算法有多重要. 主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什 ...

  8. 从零学习数据结构与算法---基础与课前准备笔记

    这里开始学习 数据结构与算法相关知识,这个主要是基于 极客时间 大佬  覃超老师的 算法训练营 和  王争老师的 数据结构与算法之美.这里再次感谢两位老师,下面文章内容主要是自己作为复习使用的笔记,如 ...

  9. labuladong的算法小抄_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

最新文章

  1. 矩阵分析与多元统计1 线性空间与线性变换3 特征值
  2. 插入排序(含希尔排序)的C/C++实现
  3. Graph Normalization (GN):为图神经网络学习一个有效的图归一化
  4. 五、Elasticsearch中的API的简单使用(Python版本)
  5. java 有选择的查询_如何在Java中将准备好的语句用于选择查询?
  6. 传锤子科技解散成都分公司 才搬迁一年罗永浩就顶不住了
  7. 前端基础-html-路径的介绍
  8. BootStrap中的日期时间组件datetimepicker
  9. asp.net三种方法实现事务
  10. 埃氏筛法求质数(例如:200以内的质数)
  11. 如何整理写作思路?MindManager在文章写作方面的应用
  12. 半导体物理学习笔记(一)
  13. 学生信息管理系统(Java+JSP+MySQL)
  14. Accuracy(精度)、Precision(精准度)和Recall(召回率)
  15. Spring中常用注解及其作用(二)
  16. IODE海洋数据门户平台简述
  17. 存算分离后,VxRail动态计算节点构建虚拟化更给力
  18. 运营商NFV MANO梦想照进现实
  19. SD客户信用值(信贷限额、应收款 预收账款、销售值、信贷风险总额、可用余额)
  20. Linux安装软件无图形化界面,无图形界面安装 Development Tools(centos版)

热门文章

  1. 聊聊前端日志库在 SaaS 产品中的应用与设计
  2. PHP框架 one 1.6.0 发布
  3. mybatis写当天 当月的数据 时间段数据https://www.cnblogs.com/xzjf/p/7600533.html
  4. 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!
  5. 关于mac注册机core keygen在10.12及以上版本不能使用的解决方法
  6. 作业21-加载静态文件,父模板的继承和扩展
  7. bootstrap-导航条反色的导航条
  8. python data analysis | python数据预处理(基于scikit-learn模块)
  9. DDD关键知识点整理汇总
  10. Apache Tomcat/7.0.47