再也不怕数据结构和算法之开篇

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

算法和数据结构是程序员的基本内功,基本内功修炼不好,以后修炼一些招式,如设计模式、架构,新的技术热点如区块链,新的技术语言go等,都会感觉非常吃力。

喜欢看武侠小说的知道,张无忌正是因为内功精纯,再加乾坤大挪移加持,学习任何武功招式都如探囊取物,短时间内即可融汇贯通。程序员的内功-数据结构和算法,乾坤大挪移-设计模式。

说实话,作为一个渣渣程序员,非CS专业出身,基础本就比较薄弱。正好借着写文章的机会,把数据结构和算法及设计模式都系统的学习一遍,并且把这些以比较容易理解的形式表达出来,授人以渔,同时自己也能理解的更透彻,何乐而不为。

扯的好像有点远了,言归正传,为什么要学习数据结构和算法,我觉得有以下几个主要原因:

  1. 应对技术面试,面过广大的程序员们,通过层层简历筛选,然后技术面试,大家的项目经历各部相同,很难深入挖掘,那怎么甄别候选人的技术能力呢?最简单也是最直接有效的方式当然就是考考你数据结构和算法咯。
  2. 程序员成长之路的基石,如同高楼大厦的地基,在有了良好的数据结构和算法的基础之上,程序员的学习能力和成长潜力才更大,以后才能走的更高更远。
  3. 面对一些问题,根据已有的数据结构和算法经验,能够设计出比较优雅及高效的解决方法。分析和解决问题的能力也会比数据结构和算法薄弱的同学更强。随着经验的慢慢积累,可以不断的设计、实现高性能系统,向着开源代码作者和架构师之路迈进。

数据结构和算法真这么重要吗?

为什么程序员被称为码农呢?大家都知道,越是大公司,分工越精细,每个人几乎都是一颗可以随时替代的螺丝钉。每天的工作也无非就是在原有的系统之上,做一些bug修复,一些小的功能点迭代。涉及到的编码无非是一些curd操作,尤其是现在在一些优秀的框架之下,程序员的编程几乎是傻瓜式的。

那怎么才能体现你的价值?告别curd boy呢?

连一些基本的数据结构和算法都掌握不了,一些普通的算法题解法都不会,你怎么能在这近百万的程序员之中脱颖而出呢?任何群体都如金字塔,处于塔尖的人很少,不能掌握好数据结构和算法,那你就基本只能处于程序员金字塔的最底端。

任何公司,都会有一些技术讨论吧!有时候技术leader拉你们一起讨论一些问题,人家说这很简单嘛,就是背包问题,或者这个用dfs算法不就ok了嘛,你如果连这些都听不懂,那是不是觉得自己很low,根本无法同别人沟通交流。更别提在技术方面有一些自己的独到见解了,也就无从谈起去一些公开场合分享自己的观点。

世界天天在变,技术热点千变万化,但是处于最基础的数据结构和算法确是处于基本不变的。学好了数据结构和算法,你就能够很云淡风轻的笑傲不断变化的新技术及新趋势,额,这归根到底不还说xx算法么,就是封装了一下而已,在数据结构和算法的基石之上,不断提升自己的思维、逻辑分析、抽象总结能力,那你就是一个越来越逼格的程序员了。

怎么学习数据结构和算法呢?

终于到了最重要的时刻,前面废了半天话,无非是想打动你这颗如顽石般的心,让你觉得学数据结构和算法好像很有用哦,那我是应该好好学啊。如果你意识到这一点,并觉得有时候面试算法对自己像是一种折磨和煎熬,又或者感觉好像自己从来就没掌握过数据结构和算法,那么恭喜你,咱们接下来可以一起学习进步了。

怎么学呢?

看到这篇文章的估计大部分已经是大学生或者已经参加工作了吧,相信你在这么多年的不断打怪升级中,总结了不少学习方法吧?在这里,我分享一下我的学习经历。

我基础比较薄弱嘛,曾经好几次发誓要学好数据结构和算法,买了书,买了课程,每次都是看完数组和链表,顶多到了递归,后面就坚持不下去了,觉得真是太难了,跟天书一般,这都是谁设计的啊。

我觉得可能90%的人都有跟我类似的经历,人本身惰性比较强,遇到挫折容易找自我安慰,但是我们真的甘心堕落吗?真的想一辈子当一个底层curd boy?从来没想过多赚点钱,早点赢取白富美,走上人生巅峰?

咳咳咳,心里想到白富美,是不是顿时感觉浑身充满了动力,白富美舍我其谁啊,那就好好跟我一起迈过数据结构这道坎(偷偷告诉你,其实是大家一起迈,我也没迈过去呢)。

  1. 数据结构和算法,先有数据结构,后有算法,首先要知道有哪些数据结构,每种数据结构是干啥的,怎么用,各有什么优缺点,分别适用于解决什么问题的场景。
  2. 多总结,多分析。任何事情,只要你不断分析总结,付出努力,总会慢慢收获的。一遍看不懂,那就看三遍,三遍不行,那就看五遍。今天看不懂,不代表以后看不懂,说不定某天就会豁然开朗。学习贵在坚持,总结,分析。
  3. 多动手,多练习,多刷题。纸上得来终觉浅,绝知此事要躬行。LeetCode应该是程序员们刷题最多的网站了,但我们也要刷题有道,不要为了刷题而刷题。所谓题海无涯,而学有涯,要掌握题目的本质,解决问题的思路,而不是沉浸在大量的、枯燥的题海战术上。

数据结构和算法的知识点

为了让你对数据结构和算法能有个全面的认识,这里借用小争哥的一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

所谓按图索骥,哪里不懂学哪里,直到某一天,你闭上眼睛,这一幅脑包图可以完整的出现在你的脑子里,并且可以清晰的回忆起每个知识点,分别对应LeetCode上哪些典型题目及经典解法,和有哪些坑点,能总结出什么经验来,平时在项目中可能会怎么用到,那你就真的是学到了。

作为一名典型普通程序员,我也跟你一样,很懒。如果你觉得写的有点道理,并且想和我一起好好迈过数据结构和算法这道坎,记得点个??哦,如果能留言评论交流就更好了。

程序员之道,在无止境,扫码关注催更,一起无止境学习吧!

原文地址:https://www.cnblogs.com/chanllenge/p/12528483.html

时间: 2024-10-11 14:21:12

再也不怕数据结构和算法之开篇的相关文章

Java数据结构和算法(一)——开篇

这篇文章里面不讲技术,抽空讲讲技术和通俗之间有一种奇特的关系,还有驱动力学习的东西. 1)技术与通俗 大学里面那本严蔚敏的数据结构不厚,内容丰富,但是复杂问题的讲解方面篇幅这样就少了,比较难理解,c也不是很擅长,但是基本的思路还是有的. 简单的链表,数组,堆栈,队列,图,几个排序算法. 后面看到知乎涛吴的回答,当时很震撼,这里引用一下他的回答: 如果说 Java 是自动档轿车,C 就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而

我的软考之路(七)——数据结构与算法(5)之查找

上篇博文我重点介绍了八大内部排序,这篇博文(数据结构与算法的最后一课)重点介绍查找,我们依旧沿用上篇博文的风格,先简单介绍,再以例子重点讲解. 下面我们开始今天的旅行,首先祝你旅行愉快,呵呵. 静态查找 若查找目的是为了查询某个特定的数据是否在表中或检索某个特定数据的各种属性,则此类查找表为静态查找表. 1.顺序查找 基本原理:从表一端开始逐个和关键字进行比较,若找到一个记录和给定值相等,则查找成功,反之失败.再简单点就是,一个一个的比大小,看看是否相等. 例子: 顺序查找更适合于顺序存储结构和

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

我的软考之路(五)——数据结构与算法(3)之图

图跟树一样,也是非线性结构,咋看起来有点复杂,其实它很简单.树具有层次关系,上层元素可以与下一个多个元素连接,但是只能和上层的一个元素连接.在图结构中,节点间的连接是任意的,任何一个元素都可以与其他元素连接. 图相对而言很简单,我们只介绍的图的遍历和最小生成树,现在我们开始. 遍历 1.概念 从图中某一个顶点出发,访问图中的每一个结点,并要求只能访问一次,不能重复访问. 2.方法 (1)广度优先遍历 基本思想:首先访问顶点,再访问顶点的全部未访问的邻结点,再访问邻结点的所有结点即可(类似树的层次

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

我的软考之路(六)——数据结构与算法(4)之八大排序

排序是编程的基础,在程序中会常常使用,好的排序方法能够帮助你提高程序执行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来.不管你的技术多么强,假设没有基础也强不到哪去. 不多说了,我们直接进入今天的主题. 总有人说排序非常难,可是我总认为非常easy,我们仅仅须要了解基本思想就好了,通过简单的样例来加深理解. 1.直接插入排序 (1)简单介绍:直接插入排序,从字面意思能够看出,直接插入数据完毕排序. (2)基本思想:在插入第i个数时,如果前i-1数已经排好序了,仅仅须要将第i个数插入到i

我的软考之路(四)——数据结构和算法(2)树和二叉树

上鲍恩描述了数据结构的线性结构,我们引入非线性结构本博客-树和二叉树.我想向大家介绍一些基本概念树,树遍历,然后介绍了二叉树的概念和特征.和二叉树遍历.叉树的对照,总结. 树为了描写叙述现实世界的层次结构,树结构中一个数据元素能够有两个或两个以上的直接后继元素. 树的基本概念: 树的概念是学习树的关键所在.掌握了树的基本概念,学会树与二叉树,so easy. 我通过一棵树来了解树的基本概念.例如以下图 1.结点的度 结点的度是子结点的个数.比如:结点1有三个字结点2,3,4,所以结点1的度为3.

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度: