用通俗易懂的语言解释 40 个关键计算机科学概念

252 阅读22分钟

用通俗易懂的语言解释 40 个关键计算机科学概念

翻译自 卡尔·切奥 (Carl Cheo) 对失效链接进行了替换,需要科学上网

原文地址:carlcheo.com/compsci

为了让学习更有趣,这里列出了重要的计算机科学理论和概念,并用类比和最少的技术术语进行了解释。这就像是一个为每个人提供的超快速计算机科学学位课程,只是为了让你了解一般概念。 CS50 2014 - Week 0

重要说明:

  • 未注明来源的解释均为本人所写。如发现任何不准确之处,请指正。如有可能,请提出更好的建议!
  • 标题均链接到其各自的维基百科文章。请参阅维基百科以获取更严肃、更详细的解释。
  • 类比很棒,但并不完美。如果你想完全理解这些概念,你需要将事情归结为最基本的事实,然后从那里进行推理

此外,如果您刚刚开始编程,请查看此信息图

核心概念1——算法和数据结构

1.1 – 大 O 符号

假设你从亚马逊订购了《哈利波特:8 部完整电影合集 [蓝光]》,并同时在线下载了同一套电影。你想测试哪种方法更快。送货需要将近一天的时间,而下载则提前约 30 分钟完成。太棒了!所以这是一场激烈的竞争。

如果我订购几部蓝光电影,如《指环王》、《暮光之城》、《黑暗骑士三部曲》等,并同时在线下载所有电影,会怎么样?这次,送货仍然需要一天才能完成,但在线下载需要 3 天才能完成。

对于网上购物,购买商品的数量(输入)不会影响送货时间。输出是恒定的。我们称之为O(1)

对于在线下载,下载时间与电影文件大小(输入)成正比。我们称之为O(n)

从实验中,我们知道在线购物比在线下载具有更好的可扩展性。理解大 O 符号非常重要,因为它可以帮助您分析算法的可扩展性效率

注意: 大 O 符号表示算法的最坏情况。我们假设 O(1) 和 O(n) 是上述示例的最坏情况。

更多内容: Big O 符号(视频)Big O 的通俗英语解释Big O 符号初学者指南

1.2 – 排序算法

6 分钟内了解 15 种排序算法

更多: 排序算法动画美观且可配置的排序算法可视化

1.3 – 递归

电影院里有人问你坐在第几排。你懒得数,就问你前面的人。你只需将这个人的答案加 1 即可得到你当前的排号。很棒吧?然而,你前面的人也做了同样的事情,以此类推。最后问题到了第 1 排,他回答:“我在第 1 排!”从那里开始,正确的信息(每排加 1)将一直传递给提问的人。

这是另一个被称为德罗斯特效应的例子。一名护士端着一个托盘,托盘上放着一盒可可和一只杯子,杯子里有一张她拿着同样东西的较小图像,而杯子里又有一张更小版本的图像,以此类推。

这里有更多的德罗斯特效应例子,可能会让你更加昏昏欲睡

德罗斯特

如果您仍然不明白递归是什么,请查看... 否则,请继续阅读。

1.4 – 大数据

假设你花园里的水管漏水了。你拿了一个水桶和一些密封材料来解决问题。过了一会儿,你发现漏水的地方大了很多,你需要水管工带更大的工具。与此同时,你还在用水桶排水。过了一会儿,你注意到一条巨大的地下溪流已经打开。你需要每秒处理数加仑的水。

水桶已经没用了。你需要一个全新的方法来解决问题,因为水量和流速都增加了。为了防止城镇被洪水淹没,你可能需要政府修建一座巨大的水坝,而这需要大量的土木工程专业知识和复杂的控制系统。

大数据描述的数据集非常庞大且复杂,以至于无法用传统的数据处理工具来管理。

更多内容: TED-Ed 的大数据(视频)什么是大数据和 Hadoop(视频)

1.5 – 数据结构

每个计算机科学家和程序员至少应该知道:

核心概念2 – 人工智能

2.1 – 贪婪算法

远足

想象一下,你要去徒步旅行,你的目标是尽可能地爬上最高的山峰。出发前你已经有了地图,但地图上显示的路径有成千上万条。你太懒了,根本没有时间评估每一条路径。地图算了吧!你开始徒步旅行时采取的策略很简单——贪婪而目光短浅。只走坡度最大的路。

旅行结束后,你浑身酸痛、疲惫不堪,第一次看登山地图。天哪!有一条泥泞的河,我应该穿过它,而不是一直往上走。

贪婪算法会选择最佳的直接选择,并且永远不会重新考虑它的选择。

2.2 – 爬山

雾山

这次你要爬另一座山。你决心要找到通往最高峰的路。但是,没有地图,而且雾很大。为了让你的旅行更轻松,你下载了一个徒步旅行应用程序,它可以跟踪你走过的路径并测量你当前的海拔高度。

你一次又一次地攀登这座山。每一次,你都走着同一条路,到达有史以来的最高峰,但在旅途的中途,你却选择了一条略有不同的路线

您还可以随机选择不同的起点,这称为随机重启爬山。这样您就不会只是在同一区域徘徊,并降低陷入困境的概率。

爬山算法通过生成邻近解来尝试寻找更好的解。每个邻近解都是基于迄今为止的最佳解生成的,并修改单个元素

2.3 – 模拟退火

珠穆朗玛峰

这是珠穆朗玛峰,你面临的最大挑战。你的目标是登顶,但一遍又一遍地攀登珠穆朗玛峰是不切实际的。你只有一次机会。你现在更加谨慎了。你不再总是向上攀登,而是偶尔移动到较低点并探索其他路径,以减少走错路的机会。你爬得越高,移动到较低点并探索的可能性就越低。

2.4 – 动态规划

爸爸: 在纸上写下“1+1+1+1+1+1+1+1+1 =”

爸爸: 这等于多少?

孩子: 数数,三秒后 八!

爸爸: 在左边写下另一个“+1”

爸爸: 现在呢?

孩子: 立刻 九!

爸爸: 哇,你是怎么算得这么快的?

孩子: 你刚刚又加了一!

爸爸: 所以你不需要重新数数,因为你记得之前是八。太棒了!

上面的例子描述了记忆法(是的,是记忆化,不是记忆),一种动态规划中的自上而下的方法,它存储以前计算的结果以供将来使用。

更多内容: 动态规划 – 从新手到高级 (TopCoder)动态规划教程 (CodeChef)

2.5 – 机器学习

Pararth Shah在这里写了一个精彩的比喻,但它太长了,无法收录。

2.6 – P 与 NP 问题

P vs NP 是计算机科学领域最流行和最重要的未解决问题之一。

假设我给你一道乘法题,例如:

Q1: 7 x 17 = p

答案是 119。很容易解决吧?如果我反转这个问题会怎么样:

Q2: p x q = 119(pq不能是 1 和 119)

为了解决 Q2,假设您没有看过 Q1,您可能必须浏览从 2 到 118 的所有可能的数字。我们尚未发现一种可以轻松找到数字因数的有效算法

如果我问你:p可能是 7 吗?你可以轻松验证答案,对吧?只需将 119 除以 7!

乘法很容易,但寻找一个数的原始因数却很难。

因此 Q1 是一个 P(多项式)问题,因为它很容易求解。计算机可以轻松地将 2 个超大数字相乘,并且不会比小数字花费更多的计算机时间。

Q2 是一个 NP(非确定性多项式)问题,因为它很容易验证,但很难解决。对于计算机来说,找到 119 的因数仍然相当容易,但对于 500 位数字呢?目前任何计算机都不可能做到这一点。

重点来了:NP 问题(例如因式分解)是否也是 P 问题(例如乘法),只是我们还没有找到解决 NP 问题的有效方法?NP 问题真的很难解决吗?还是我们只需要一位杰出的科学家(或您?)的“顿悟时刻”来提出一个有效的算法?或者人类太笨了?想象一下,存在拥有比人类更高智力的机器或生命。他们看待我们就像我们看待蚂蚁一样。我们的智力水平对它们来说太微不足道了。解决 P vs NP 问题对它们来说就像解决 1 + 1 一样!

那么,为什么 P vs NP 问题如此重要?如果我们能够证明 P=NP,那就意味着所有 NP 问题都可以在合理的计算机时间内轻松解决。我们将能够治愈癌症(蛋白质折叠)、破解密码(RSA)等。这将改变世界。

P vs NP 被克雷数学研究所列为 7 个千禧年大奖难题之一。第一个正确的解决方案将获得 100 万美元的奖金。

更多内容: P 与 NP 以及计算复杂性动物园(视频)简易维基百科

核心概念3——计算机架构和工程

3.1 – 计算机如何工作?

抽象

计算机的工作原理是不断增加复杂性。当你开车时,你不一定非要了解汽车引擎的工作原理。复杂的细节是隐藏的。

那么计算机如何将二进制代码(0 和 1)转换成程序呢?这里有一个很棒的视频,它使用多米诺骨牌来直观地展示计算机如何在最基本的层面上执行二进制计算:

多米诺骨牌加法

更多: 计算机工作原理的交互式解释

3.2 – 停机问题

图灵与停机问题

更多内容: Freeze App 类比简易维基百科

计算机体系结构工程是一个巨大的主题,其中包括操作系统编译器等子领域。

核心概念4 – 并发

假设你在 A 公司担任秘书。你需要接听电话、安排会议、打印文件等。你总是需要根据优先级在任务之间来回切换。每次电话铃响起,你都必须停止正在处理的任务。

并发是程序和系统的一种属性,允许任务在重叠的时间段内运行。

4.1 – 并行性

最终,你无法应付工作,因为数据输入任务太多了。你向老板抱怨,他很高兴地雇佣了一名数据输入员来处理你的数据输入任务。

并行允许两个或更多任务同时运行,前提是机器具有多处理能力。

然而,并发概念的实现也引入了更多潜在问题,例如竞争条件。

4.2 – 竞争条件

如果你允许银行系统中进行并发交易并且不处理竞争条件,将会发生以下情况:

  • 您的银行账户中有 1000 美元。
  • 有人给您转了 500 美元,您从 ATM 机上取了 300 美元。
  • 假设两笔交易同时执行,两笔交易都会将 1000 美元视为您的当前余额。
  • 现在,事务 A 向您的帐户添加了 500 美元,现在您的帐户余额为 1500 美元。但是,事务 B 也将 1000 美元视为您的当前余额,并在一毫秒后完成,从 1000 美元中扣除 300 美元,并将您的帐户余额更新为 700 美元。
  • 您现在拥有 700 美元而不是 1200 美元,因为交易 B 覆盖了交易 A。
  • 发生这种情况的原因是银行系统不知道其他正在进行的交易。

那么,如何处理上述情况呢?一种非常简单的方法就是互斥。

4.3 – 互斥(Mutex)

现在,每当有正在进行的交易时,系统就会锁定参与该交易的账户。

这次,当交易 A 发生时,你的账户就被锁定了。你不能从 ATM 取款。只有当交易 A 完成时,它才会解锁。

那么互斥解决了问题,对吗?是的,但是没人希望每次进行交易时都被 ATM 拒绝。

让我们稍微修改一下解决方案。

4.4 – 信号量

4.4.1 – 二进制信号量

现在,让我们为不同类型的交易设置不同的优先级。假设现金提款请求的优先级高于银行转账。当您从 ATM 取款时,交易 A(银行转账)将停止并允许交易 B 先进行,因为它具有更高的优先级。交易 B 完成后,它将恢复。

4.4.2 – 计数信号量

二进制信号量很简单。1 = 正在进行事务。0 = 等待。另一方面,计数信号量允许同时运行多个进程。

假设您是一家水疗中心的更衣室经理。这里有 30 个储物柜。每次收到或分发钥匙时,您都必须记录自己拥有的钥匙数量,但您不知道他们到底是谁。如果所有储物柜都满了,其他人就必须排队。每当有人用完时,他/她就会将钥匙交给排队的第一个人。

4.5 – 死锁

死锁是并发系统中的另一个常见问题。

让我们用相同的银行系统类比来描述不同的场景。请记住,只要有正在进行的交易,银行账户的访问权限就会被锁定。

  • 彼得 向您转帐 1000 美元(交易 A),同时您向他转帐 500 美元(交易 B)。
  • 交易 A 锁定 彼得 的账户并从 彼得 的账户中扣除 1000 美元。
  • 交易 B 锁定您的账户并从您的账户中扣除 500 美元。
  • 然后,交易 A 尝试访问您的帐户以添加来自 彼得 的 1000 美元。
  • 同时,交易 B 还尝试将您的 500 美元添加到 彼得 的账户中。

但是,由于两笔交易都未完成,因此双方都无法访问锁定的账户。双方都等待对方完成。陷入僵局。

这是一个真实的例子:

男孩: 让她先接近我。

女孩: 让他先接近我。

一段萌芽中的爱情故事就此终结

核心概念5– 计算机安全

5.1 – 计算机黑客

黑客攻击类似于闯入房屋。以下是一些流行的黑客技术:

门把手

5.1.1 – 暴力攻击

尝试成百上千个不同的钥匙。经验丰富的窃贼会首先尝试最常用的钥匙。

暴力攻击会尝试所有可能的密码,通常从猜测常用密码开始,如“123456”、“abcdef”等。

5.1.2 – 社会工程学

隔壁刚搬来一对夫妇。他们非常友善,乐于助人。他们经常邀请你来家里吃饭。有一天,你提到你很快就要去度假两周。他们很高兴地提出帮你照顾狗。你给他们留了一把备用钥匙。从那以后,你就再也没有听到过他们的消息了。

社会工程学是诱骗用户泄露他们的私人信息。

5.1.3 – 安全漏洞

窃贼会检查每一个可能的入口,以找到最容易进入的方法(弱点)。也许你二楼的窗户开着,谁知道呢?

5.1.4 – 特洛伊木马

一名窃贼假装是水管工,你帮他打开了门。他修好了你漏水的水管,一切看起来都很正常。他离开后,你发现你的珠宝不见了。

特洛伊木马是一种伪装成有用或有帮助并在后台运行恶意代码的恶意软件程序。

5.1.5 – Rootkit

你的门锁卡住了,你打电话给锁匠。他修好了你的门锁,并偷偷复制了另一把钥匙。

rootkit可以通过社会工程学等各种方式获取计算机的管理员root权限,然后伪装成杀毒软件难以检测到的必要文件。

5.1.6 – 分布式拒绝服务攻击 (DDoS)

这是一个书店的类比。

想象一下,有 100 个人同时光顾您的小书店。您的书店已满,其他人无法进入。您无法要求他们中的任何人离开,因为他们似乎不是成群结队的。他们可能根本不认识彼此。他们中的大多数人似乎真的有兴趣买书。有些人甚至会问您书架在哪里。柜台上的人只会用便士付给您。

人们连续几个小时进进出出。他们看起来都很正常。一天下来,你只卖出了一本书。还记得那个用便士付钱给你的人吗?

DDoS 试图通过向网站或服务注入大量访问者来使其瘫痪

DDoS Attack Global Map

5.2 – 密码学

密码学是安全通信的研究和应用。以下是两种最广泛使用的加密协议:

挂锁

5.2.1 – 对称加密

假设 刘英 和 玉田 想要互相寄东西。为了确保没人能看到他们的东西,他们用一个盒子把盒子锁起来。他们为锁制作 2 把相同(对称)的钥匙,并提前见面分享钥匙。

5.2.2 – 非对称加密

两个人共享相同的钥匙没问题。如果 刘英 想与另一个叫 王天来 的人交换东西,而 刘英 又不想让任何人看到他们的东西,该怎么办?刘英 不能使用她与 玉田 共享的相同锁和钥匙,否则 玉田 可以轻松打开箱子!

当然, 刘英 可以与 王天来 分享一把全新的不同锁和钥匙,但如果 刘英 想与 10 个不同的人交换东西怎么办?她需要保管和管理 10 把不同的钥匙!

因此 刘英 想出了一个绝妙的解决方案。现在,她只保留一把钥匙(私钥)。她将相同的挂锁(公钥)分发给她的朋友。任何人都可以关闭挂锁(加密),但只有她有钥匙可以打开(解密)。现在,任何人都可以使用她分发的挂锁向 刘英 发送东西,而 刘英 不再需要为不同的人管理不同的钥匙。

如果 刘英 想要发送一些东西给 王天来,她会要求 王天来 提供他的挂锁(公钥),这样她就可以用它来锁定(加密)她的东西并将其发送给 王天来。

基本原理是:每个人都有自己的私钥来解密消息,并且他们会向发送者提供自己的公钥来加密消息。

更多内容: 公钥密码学:Diffie-Hellman 密钥交换(视频)

核心概念#6——软件开发方法

6.1 – 瀑布式开发

你要弄清楚你需要做的所有事情并记录下来(需求)。就像瀑布一样,除非你重新开始,否则无法返回。只有当前阶段完成后,你才能进入下一阶段。

瀑布模型

6.2 – 敏捷开发

一开始,你要弄清楚需要做的一些事情。然后,随着开发的进行,不断改进、发展、协作和适应。

以下是敏捷开发方法的一些流行实现:

6.3 – 现实世界中的软件开发

所以你毕业了。你写出了优秀而优美的代码(希望如此),到目前为止一切都很完美。让我向你介绍牛仔编码,这是一种大学里没有教过的软件开发方法。

接下来,你想知道为什么你不擅长估算开发时间:

马拉松类比

而且方法论经常被错误地实施:

敏捷编程

极限编程

这就是我们要讲的。简而言之,这就是计算机科学。

欢迎随意建议添加任何您认为重要且常常令人困惑的新计算机科学理论或概念。

初学者常见问题

Q1——计算机科学和编程有什么区别?

计算机科学家就像物理学家,程序员就像工程师。

Q2–什么是编程?

向一台愚蠢但听话的机器写入非常具体的指令。

这是什么意思?想象一下,你必须教一个孩子如何洗澡。孩子只知道如何遵循你的指示。所以你要求孩子:

  1. 走进浴室。
  2. 打开淋浴。
  3. 站在淋浴下。
  4. 拿起肥皂。
  5. 等等…

哦,等等,这孩子进淋浴间之前甚至都没有脱掉衣服!

这就是计算机的工作方式。你必须告诉计算机它到底需要做什么。它不知道如何假设,也从不考虑后果。

Q3——为什么你不应该在开发人员专注时打扰他/她?

进入状态就像睡着了一样。想象一下,你正在叫醒一个再过几秒钟就快要睡着的人。现在他/她必须花更多时间才能重新入睡!

Q4–Java 和 JavaScript 有什么区别?

他们根本就没有任何关系。

Java 和 Javascript 相似,就像汽车和地毯 老婆和老婆饼 相似一样。

Q5–JavaScript 和 JQuery 有什么区别?

JQuery 是一个基于 JavaScript 构建的库。

Javascript 是丑陋的书呆子,而 jQuery 则是将他变成英俊四分卫的巫师。

Q6 –框架和库有什么区别?

你调用库。框架调用你。

图书馆是一种工具。框架是一种生活方式。

Q7 – 一名软件工程师平均每天写多少行代码?

这很难说。当开发人员偿还技术债务时,这个数字甚至可能是负数。

通过代码行数来衡量软件生产力就像通过飞机的重量来衡量飞机的进度一样。

Q8–什么是面向对象编程?

对象是名词,方法是动词。

对象就像人一样。它们是活生生的、会呼吸的东西,它们拥有关于如何做事的知识,并且拥有记忆,因此它们能够记住事情。你不是在非常低的层次上与它们互动,而是在非常高的抽象层次上与它们互动,就像我们现在所做的那样。

举个例子:如果我是你的洗衣对象,你可以把你的脏衣服给我,然后给我发一条消息说:“你能帮我洗一下衣服吗?”我碰巧知道旧金山最好的洗衣店在哪里。而且我会说英语,口袋里也有钱。所以我出去叫了一辆出租车,告诉司机把我送到旧金山的这个地方。我去洗你的衣服,然后跳上车,回到这里。我把你的干净衣服给你,然后说:“这是你的干净衣服。”

你不知道我是怎么做到的。你对洗衣店一无所知。也许你会说法语,甚至不会叫出租车。你付不起车费,口袋里也没有钱。但我知道如何做到这一切。而你不必知道这一切。所有这些复杂性都隐藏在我内心,我们能够在非常高的抽象层次上进行交互。这就是对象。它们封装了复杂性,而复杂性的接口是高级别的。

Q9——什么是应用程序接口(API)?

在餐厅,你从菜单(API)上点菜(调用API)。一旦食物准备好(API响应已准备好),服务员就会为你提供食物。

基本思想是:你提出你想要的东西,系统就会返回响应,而不会暴露幕后发生的事情。

Q10–SQL 和 NoSQL 数据库有什么区别?

超级市场

NoSQL 数据库存储信息的方式就像书中的食谱一样。当您想要知道如何制作蛋糕时,您可以查阅该食谱,有关如何制作该蛋糕的所有信息(配料、准备、混合、烘焙、精加工等)都在这一页上。

SQL 就像是为菜谱采购食材。为了将所有食材放入购物车,您必须去多个不同的货架购买每种食材。购物结束后,您的购物车里会装满您跑来跑去收集的所有食材。

如果有一家商店按食谱进行组织,这样你就可以去商店的一个地方,从那里买到你需要的一切,那不是更好吗?当然,你会在 50 个不同的地方找到鸡蛋等配料,因此在货架上备货时会有一点开销,但从消费者的角度来看,找到他们想要的东西要容易/快得多。