计算机科学三大浪漫:操作系统、编译原理、数据结构和算法
什么是数据结构
PS:可跳过
最粗糙的理解,数据结构就是数据在逻辑层面的存储组织形式(百度百科的解释)。
所谓逻辑层面,就是我们实际上不考虑数据究竟是怎么以一种实体形式存放在内存或者外存中,我们抽象的思考它。
为了表述清楚,我们通常还会画图,用图的形式来表达。你会看到一些“盒子”“箭头”之类的图案,这些都是想象中存在的。
常见的数据结构有:
-
有的是一堆一堆的散乱的存放,我们就把它称之为:堆(有歧义)
-
有的是像是在一排连续的盒子里装着的,每个盒子依次编号,我们将其称之为:数组
-
有的是像链子一样串成一串,我们就把它称之为:链表
-
链表还可以像树一样分叉,我们就把它称之为:树(又被称之为堆)
-
……
@想一想@:我们还接触/已经学习过什么数据结构?
什么是算法
标准的定义比较复杂。简单的理解:
让计算机按预定的指令,一步一步地解决某个特定问题的的方法。(复习:图灵机,加深理解)
比如:在一堆数字(7 3 8 9 4 1 2 6 5)里面找到最大的一个数。
-
人脑:一眼就看出9最大
-
电脑:凭什么9最大?我只知道7比3大,8比7大……
PS:转换思路的小窍门:想象一下对1000个、10000个数字进行排序,当你(人脑)不能“一眼看出”谁最大的时候怎么办?
算法(最常用的)最小单元就是:赋值、分支和循环
理论上,一个问题只要能找到算法,计算机就能将其解决;反之……
算法能解决那些实际的问题?生活中例子,三个最:
-
最多思考:电梯调度算法
-
最常用:地图导航
-
最牛逼:AlphaGo
程序=数据结构+算法
聪明如你,其实就应该想到了:本质上来说,程序就包含两部分内容:
-
数据:数值、文本、图像……
-
指令:在哪里拿到数据,如何处理数据……
以用户登录为例:
-
数据:当前用户输入的,和数据库里保存着的用户名和密码
-
指令:将用户输入和数据库存储进行比较,如果相符,就……;否则,就……
上述两部分并进一步高度概括,就有了这句非常经典的论断:
程序=数据结构+算法
(搞笑版:程序=google+英语)
真的需要学习数算么?
PS:纯小白跳过,跟着飞哥学就是了……
为什么会有这个问题?
-
算法非常难,而且枯燥烧脑,让人痛不欲生
-
在实际的工作中,教材上学到的算法,“用”得很少很少(如何将数据结构和算法应用到实际之中? 1006个关注,9个回答)
一般来说,《数据结构和算法》这本书上提到的任何算法/数据结构,你都不会有机会重新实现一次。
由此产生了两种解释:
-
算法无用论:用都用不到,学它干嘛?“浪漫”意味着什么?华而不实。
-
算法至上论:用不到?那是你层次太低……“不会数据结构和算法,一辈子都只能是个码农”
为什么还要讲?
虚一些的理由:
-
浪漫和逼格(很多东西,你去了解去学习,不就是为了能吹牛逼么?,^_^),偶尔还是可以有
-
向其中所凝聚的人类智慧致敬!
-
不要让妈妈问我为什么跪着敲代码。盲目崇拜并不可取,未知带来恐惧;而了解和熟悉,可以将我们拥有一颗“平常心”(冷静和理智)
实实在在的的原因:
-
就业需要,面试要问。尤其是:
-
校招,除了这个也没啥好问的,实操你不可能懂;
-
大厂,流行这个,所谓“考你的基本功”。面试造航母,工作拧螺丝,O(∩_∩)O哈哈~
-
教学需要:
-
基础语法应用:变量赋值/分支/循环……
-
理解并应用用“电脑思维”:用循环和分支来解决问题
你要不要学?
-
对飞哥的误解:“先上车,再买票”不是“先上车,不买票”
PS:飞哥总是被误解,比如学历,反思……
-
飞哥对人性的误解:以后再学 ≈ 不会再学
建议:现在能学就学。时间紧迫,把握一个度就OK了。