0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

大学应该更偏向技术还是算法和数据结构这类?

算法与数据结构 来源:编程指北 作者:编程指北 2021-07-04 15:11 次阅读

经常有学妹问我(其实学弟也爱问):

大学应该更偏向技术还是算法和数据结构这类。

大家都是成年人了,这还用选吗?

当然是两者都要重点啃下来呀,算法和技术相辅相成的,一定不要有二选一的想法!

算法和数据结构可以说是技术(包括MySQL、Java、Redis、操作系统这些)的基石:

5d29ea2c-d96e-11eb-9e57-12bb97331649.png

我当时大一也是觉得数据结构没啥用,哪有学个 JS、CSS 写个漂亮的网页炫酷?

什么算法,明明有 qsort 还要学快排、堆排?

这玩意有 qsort 快吗?

我直接一行就排好序了,你还要写十几行,真菜呀!

那时候以为的技术就是使用各种组件、调API,比如 Map:

但是越学到后面心里越没底,因为这些东西对自己都是黑盒子。

所以如果数据结构与算法掌握不好,那么这些 API 对于我们就是一堆的黑黑子,连什么时候用 Map(红黑树实现)、什么时候用 HashMap 都分不清。

Redis 这种组件,难道只需要了解如何get、set 就是算是掌握了吗?

那肯定不行,实际上想要要用得好,得要了解 Redis 底层的那些数据结构,比如简单动态字符串(SDS、链表、字典、跳跃表、整数集合、压缩列表,才能选择适当的存储结构。

如果要问我大学什么最后悔?那肯定是没有从大一就开始好好学算法,去打 ACM。

现在还在大一、大二的同学还不抓紧机会,别给自己留下遗憾。当然,不打 ACM,我们也是能够学好数据结构和算法的。

数据结构和算法你能在任何计算机领域里看到,比如在编译原理中寄存器的分配会用到贪心,死代码检测与消除会用到图论里不可达的知识;操作系统进程、线程调度会用到多级队列和调度算法;组成原理中 Cache 的替换会用到 LRU、FIFO 等算法;开发必备的数据库也离不开B+树、LSM 等数据结构和查找算法。

很多时候我们需要的算法都被封装到编程语言的基础库里了,以至于很多同学会觉得算法离我们太远,其实不是的。

所以学习算法有助于我们根据应用场景选择最合适的数据结构。

日常开发中也一定离不开算法,比如小北最近工作中涉及的某种嵌套 TLV(Tag-Length-Value)结构编码的解析,就需要用到递归、多叉树等知识。如果不学习算法,那么程序中只能见到大量的 if/else、while/for。。。

可以说不学算法的工程师一定不是一个优秀的工程师。

再来说操作系统、编译原理,这些里面也是蕴含着各种数据结构与算法的,就拿编译原理来说。

一、编译原理遇见算法

当你学完有限状态机以后,你会发现以前觉得很牛逼正则表达式似乎自己也能用 DFA、NFA 实现一下了。状态机的思想在编程中很多地方都用得上。

比如解析 HTTP 协议,如果没学过状态机思想,你可能会一行行的 if/else 去做解析,这里最麻烦的地方在于,if/else 需要提前将 HTTP 头部字段都接收到再来判断,而我们知道 HTTP 基于 TCP,而 TCP 是流式传输,所以你很有可能是几个字符一组组接收到的,这个时候用 if/else 写出来就很难看了。

而用状态机编写起来代码就会非常优雅。状态的转移是由规则驱动的,接收到一个字符就判断一个,非常的方便。

继续学完语法分析,你会掌握递归下降分析这样非常重要的思想,你可以使用递归下降快速的实现四则运算计算器。

如果不用递归下降你可能需要先中缀表达式转后缀,然后求值,这是我们大一数据结构课写的,当时用栈写的,有点麻烦。后来学完编译原理,又用递归下降重写了一遍,区区几十行代码遍搞定。

还有一类场景在实际开发中的用的很多,比如淘宝、京东这样的电商,它们的营销规则有很多,比如满减、直减、跨店等等,这样的规则是不可能写死在代码里的。

那是怎么做的呢?

一般会实现一个配置系统,并设计一个DSL(领域特定语言)来表达这些规则,将规则直接配置到系统中,这样可以非常方便的修改,那么如何在代码里去解析 DSL 定义的规则呢?这就需要为 DSL 写一个语法解析器,这里就会用到语法分析的方法。

DSL(Domain Specific Language),它是一种用于某个特定领域的程序设计语言。这种特定于某个领域是相对于 C、C++Python 这种通用语言而言的,通用语言可以在各个领域使用,我们熟悉的大多数程序设计语言都是通用语言,它们都是图灵完备的。

像我们平常经常使用的 JSON、SQL、HTML 这些都算是一种 DSL,你甚至可以尝试用递归下降去写一个 JSON、XML 解析器,这比写电商网站更有价值的。

继续往下学你会了解到抽象语法树 AST 如何生成、如何转化为中间代码、如何对中间代码优化、最终又是怎么生成机器指令的。

你会看到贪心算法在寄存器分配中的应用,也会看到图论中的可达性分析又是如何实现死代码消除。

二、CS 基础课

所以无论是操作系统、计算机网络、编译原理这些基础CS课程,还是MySQL、Redis这些中间件,都是构建在各种精妙的数据结构与算法之上的,数据结构与算法必学,一定要重视!

如果你有 ACM 获奖经历,那 BAT 是很容易进的,但是也一定要掌握基本的CS基础课程知识,不能只重算法不重基础。

国外可能把题刷好就能拿到offer,但是国内不懂 OS、网络这些基础和一些语言八股文也是很难的!

三、CS 学习路线

很多大一大二的同学其实是不太清楚到底该计算机专业该如何自学,在这分享下我的学习路线吧:

我大学专业学计算机的,对 CS 本科课程还算了解,也经常了解学习国外 CS 课程。

CS 专业区别于其它专业很大特点就是:

工作后的内容是和专业所学的内容强相关的

比如你学了数据结构、编译原理、操作系统、计算机网络,如果你从事的是研发岗,那一定离不开这些知识。

主要靠自学

不管是科班还是非科班,想要快速持续的提高技术水平,就得靠自己去钻,尤其离不开自学。

知乎上其实很多问科班和非科班的差别在哪,其实我一直想说,你给自己充足时间去把科班的内容学习一遍,到底还能差在哪呢?

可能唯一差别就是少了一个 计算机学士学位。

也有人把这种自学出家的叫做民科,当然没有任何的讽刺意思哈。

四、那么计算机专业该如何自学呢?

最简单的方式就是参考 CS 科班同学的课程,比如下面这个:

很多,概况起来就是(下面只涉及CS专业课):

计算机导论 + 一门编程入门语言

算法与数据结构

操作系统

计算机网络

数据库系统

特定领域,如:计算机图形学、信息安全、System方向、分布式

学习的途径就是:

多看国外/国外的 CS 名校的一些开放课程 + 看经典的书 + 多写代码!!!

毕竟现在MOOC、Udemy、B站上学习的资源都是很丰富的。

唯一要做的就是筛选一些比较好的课程进行学习,在这里我主要推荐一些国外的计算机课程,他们很明显的一个特征就是注重实践。

一门课,除了理论以外,还会有配套的 Lab、assignment,而且这些老师设计 Lab 都很用心的,看视频/书 + 做 Lab,这应该算计算机科班同学一个比较好的学习方式了,有理论也有实践。

下面开始上干货:

一、计算机导论

首先建议从计算机导论课程开始,推荐下面这些课程:

Harvard的CS50 CS50: Introduction to Computer Science

Berkeley的CS61A CS 61A: Structure and Interpretation of Computer Programs

MIT的6.001 mit-6.001

随后建议学习一门语言,可以是C、Java、或Python,我推荐 C语言(当然,也可以是Python!这不是重点,重点是要多去写,入门时提高对编程的兴趣)。

提到C语言,我这里推荐国内浙大翁凯老师的课,看过的都说好,分为两门:

第一门是面向高考结束想提前自学一点编程的,叫大学先修课:C语言程序设计CAP-大学先修课

虽然叫先修课,但是覆盖了C语言的主要知识点,也适合大一新生~

第二门是C语言程序设计进阶:C语言程序设计进阶

会带你用C语言完成一些有趣的项目,比如一些图形界面小游戏,先修课学习C语言语法基础,进阶课带你项目实操,搭配使用,你就是同学中的大神!

有了语言基础之后建议学数据结构与算法:

数据结构推荐:

Stanford CS106系列

CS106A: Programming Methodologies

算法推荐:

6.046(进阶) Design and Analysis of Algorithms - MIT

MIT的6.006 Introduction to Algorithms

Coursera上的Princeton课程

Berkeley的CS61A 和 CS61B

学习完经典的数据结构和算法之后就可以去刷题了。

操作系统推荐:

CMU的15-213

Berkeley的CS162,

这两个都是有视频有lab的好课

还有一个非常经典的 MIT 6.828,附带一个xv6 lab

课程:6.828: Operating System Engineering

组成原理、体系结构:

MIT的6.004,

CMU的15-213

Berkeley的CS61C

计算机网络:

Stanford的CS144,lab 很有意思

五、新手快速自学的方法

一个原则,来自翁凯老师:

学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的

建立抽象层,我自己的感悟

计算机里,几乎都是人造的概念,大部分的东西,只要你一直深挖下去,几乎都可以搞明白。

但是要注意时间成本,软件行业已经不是一般的复杂和巨大,任何一个领域的知识的复杂性都足够耗费掉我们一生的时间,所以一定要抓住主线,对于技术和知识,要学通用的、流行的,可以尝试面向面试学习。

“打破砂锅问到底”式的学习虽然精神可敬,但性价比并不划算。

一定要学会在适当的层次上抽象出一层,并且认可这一层提供的接口,不去深究内部实现,了解原理即可,不必深究内部实现。

比如学习 HTTP,那么就先认可 TCP 提供的稳定可靠传输,而不继续深挖 TCP 的内容,等到学习传输层的时候再去深入挖掘 TCP 具体实现。

也就是我们常说的面向接口/抽象编程。

视频为主,看书为辅

新手,一定不要一直看书,保持看书的时间不超过 50%,按照下面的流程:

看书学习基本的理论

编程练习、实践

有了新领悟,继续看书

如此反复的循环。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4615

    浏览量

    92999
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40148

原文标题:学妹:大学四年以算法为重还是技术为重?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DDC264配置寄存器数据写入和320 DCLK时钟脉冲后的回读数据结构是什么?

    配置寄存器数据写入和320 DCLK时钟脉冲后的回读数据结构是什么? 根据注和表9,16位配置寄存器数据,4位修订ID, 300位校验模式,怎么可能有1024 TOTAL READBACK BITS, format = 0
    发表于 11-19 07:58

    视觉软件HALCON的数据结构

    在研究机器视觉算法之前,我们需要先了解机器视觉应用中涉及的基本数据结构。Halcon数据结构主要有图像参数和控制参数两类参数。图像参数包括:image、region、XLD,控制参数包括:string、integer、real、
    的头像 发表于 11-14 10:20 427次阅读
    视觉软件HALCON的<b class='flag-5'>数据结构</b>

    鲁棒性算法数据处理中的应用

    一、鲁棒性算法的基本概念 鲁棒性算法是指在面对数据中的异常值、噪声和不确定性时,仍能保持稳定性能的算法这类
    的头像 发表于 11-11 10:22 370次阅读

    嵌入式常用数据结构有哪些

    在嵌入式编程中,数据结构的选择和使用对于程序的性能、内存管理以及开发效率都具有重要影响。嵌入式系统由于资源受限(如处理器速度、内存大小等),因此对数据结构的选择和使用尤为关键。以下是嵌入式编程中常用的几种数据结构,结合具体特点和
    的头像 发表于 09-02 15:25 496次阅读

    揭秘编程核心:基本数据结构算法思想详解

    描述问题的数据除了各数据元素本身,还要考虑各元素的逻辑关系,主要是一对一的线性关系,一对多的树型关系和多对多的图形关系。
    的头像 发表于 04-25 11:51 1100次阅读
    揭秘编程核心:基本<b class='flag-5'>数据结构</b>与<b class='flag-5'>算法</b>思想详解

    探索编程世界的七大数据结构

    结构就像是一颗倒挂的小树,有根、有枝、有叶。它是一种非线性的数据结构,以层级的方式存储数据,顶部是根节点,底部是叶节点。
    的头像 发表于 04-16 12:04 394次阅读

    CAN原理和通信软件推荐

    看过一些资料还是不太理解这个CAN通信,CAN通信的原理是什么?尤其是CAN的分类和数据结构,CAN分为标准帧和扩展帧,对于这两个帧的具体含义是什么? 在变频器上扩展CAN通信卡,有什么CAN通信软件推荐,我可以在软件上直接发送帧控制变频器?
    发表于 03-23 22:49

    fpga和数字ic区别 fpga和plc区别

    逻辑设计可以通过编程随时改变应用场景,模拟各种硬件的并行运算。而数字IC则专注于传递、加工、处理数字信号,它是按照功能分类的集成电路的一种。 两者在功能和应用上也有所不同。FPGA设计偏向于产品化,通过在产品上实现逻辑控制、
    的头像 发表于 03-14 18:08 2664次阅读

    TASKING编译器是否可以将数据结构设置为 \"打包\"?

    TASKING 编译器是否可以将数据结构设置为 \"打包\"? GCC 很早以前就提供了这种可能性,可以将__attribute__((packed))与对齐指令结合使用。 对于
    发表于 03-05 06:00

    矢量与栅格数据结构各有什么特征

    矢量数据结构和栅格数据结构是地理信息系统(GIS)中最常用的两种数据结构。它们在存储和表示地理要素上有着不同的方法和特征。在接下来的文章中,我们将详细介绍这两种数据结构并比较它们的特点
    的头像 发表于 02-25 15:06 2647次阅读

    为什么CIPOS™ Mini偏向于使用IGBT芯片,而非Si MOSFET?

    英飞凌作为电力电子领域创新解决方案的领先企业,其取得的一大显著成就是,开发了用于集成功率模块(IPM)的绝缘栅双极晶体管(IGBT)和金属氧化物半导体场效应晶体管(MOSFET)。这些紧凑的电力电子器件有助于打造更加集成、可靠且高性价比的解决方案。本文探讨了英飞凌在其CIPOSMini产品中,
    的头像 发表于 02-19 13:15 403次阅读
    为什么CIPOS™ Mini<b class='flag-5'>更</b><b class='flag-5'>偏向</b>于使用IGBT芯片,而非Si MOSFET?

    嵌入式软件开发应该掌握哪些知识?

    掌握的知识 1.基础知识 1.1 c/c++编程语言和数据结构 C/C++ 是嵌入式系统中常用的编程语言,因为它们提供了直接访问硬件的能力。通过使用特定的编译器和调用硬件相关的接口,可以实现对各种外设
    发表于 02-19 11:23

    区块链是什么样的数据结构组织

    区块链是一种特殊的数据结构,它以分布式、去中心化的方式组织和存储数据。区块链的核心原理是将数据分布在网络的各个节点上,通过密码学算法保证数据
    的头像 发表于 01-11 10:57 2276次阅读

    结构体与指针的关系

    在C语言中,结构体(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个复杂的数据结构
    的头像 发表于 01-11 08:00 1008次阅读
    <b class='flag-5'>结构</b>体与指针的关系

    《深入理解FFmpeg阅读体验》+ 书收到了,崭新的开篇

    的嵌入式技术水平能够上一个台阶。现阶段的工作大部分还是偏向单纯的逻辑控制,这应该不是我的极限。下一步,我想在图像
    发表于 01-07 18:57