ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

计算机科学概论第5-12章:从算法到人工智能的系统学习指南

计算机科学概论第5-12章:从算法到人工智能的系统学习指南 很多人第一次拿到《计算机科学概论第13版》会被前四章的内容骗过去——数据存储、数据操控、操作系统、组网一路读下来感觉很顺畅觉得计算机原来就是这么工作的信心满满。然后翻开第五章算法看到大O记法那一刻书就再也没有被打开过。我见过太多这样的读者。但这恰恰是最可惜的地方一本叫概论的书真正的价值恰恰在5到12章。这里的每一章都是后续计算机科学核心课程的一扇门——算法与数据结构、程序设计语言、软件工程、数据库、图形学、人工智能、计算理论几乎每一章都可以延伸成大学里一门独立的专业课。你光靠写代码是学不到这些东西的。这篇文章就是给正在读或准备读这本书的人准备的。我会把第5到12章的内容串起来讲一遍每章到底在解决什么问题里面的核心概念怎么理解为什么这些内容这么重要以及我自己在实际学习中的一些方法和踩过的坑。我不打算逐段复述教材而是帮你建立起一套读完不白读的认知框架让你看完能知道这些章节之间的关系也知道怎么去学它们。1. 从第5章开始说起这8章到底在讲什么1.1 为什么前半本会让你误判这本书的难度书的前四章讲的是存储单元、内存地址、CPU取指令执行指令、操作系统调度、网络分层。这些内容的特点是有明确的机器作为对象你很容易找到直观对应物——内存就是一个大柜子进程就是柜子里跑来跑去的小人网络就是一条条邮路。读者容易产生一种错觉计算机科学就是把这些机器规则记牢。但第5章开始视角从机器转向问题。你不再关心内存地址怎么编码而是关心给定一个规模很大的问题用哪种方法能更快解决。这个转向让很多初学者措手不及大O记法、伪代码、递归、复杂度分析全是抽象的东西没有硬件可以摸自然就懵了。你千万不要因此怀疑自己。这其实是学科的正常分层前四章是计算机系统后八章是计算机科学。前者回答机器是怎么运转的后者回答我们如何系统性地用机器解决问题。难度陡增是正常的不是你的问题。1.2 一张地图5到12章的八段旅程在往下拆之前我先给一张全局地图。这八章不是随便排的它们之间有非常清晰的递进关系章节核心问题一句话概括第5章 算法怎么一步步解决问题给一个问题找一套可执行、可分析的步骤第6章 程序设计语言怎么把步骤表达给机器用语言把算法落到代码第7章 软件工程怎么组织大规模代码让编程从个人手艺变成团队工程第8章 数据抽象怎么组织和操作复杂数据用栈、队列、树、图给数据建模第9章 数据库系统怎么持久化、查询海量数据关系模型与SQL第10章 计算机图形学怎么用计算机生成画面把数学变成像素第11章 人工智能怎么让机器表现智能从规则系统到机器学习第12章 计算理论哪些问题在原理上解决不了图灵机、停机问题、P与NP我建议你把这八章分成三个板块理解方法层第5、6、7、8章不管是写脚本、做网站还是搞AI你每天干活都离不开的基本功。应用层第9、10、11章计算机科学在数据、视觉、智能三个方向上的典型落地。边界层第12章告诉你哪些问题不是编程水平不够而是原理上就不可计算或极难计算。有了这张地图你学每一章的时候都知道自己站在哪里、为什么要学它就不会再觉得内容零散了。2. 算法和语言从解决问题的思路到机器能懂的表达2.1 第5章算法先别管代码先把怎么做说清楚第5章是全书第一个真正的分水岭。这一章的大部分篇幅在教你三件事怎么用伪代码描述过程、怎么用大O分析效率、怎么用递归拆解问题。伪代码的价值被很多人低估。你会觉得反正我都能写Python了为什么要学伪代码。但当你面对一个复杂的算法时直接用编程语言写容易被语法细节绊住用自然语言写又会有歧义。伪代码介于两者之间它的目的就是让你把注意力放在步骤上。我自己的习惯是拿到任何问题先用中文把步骤写出来再翻译成伪代码最后才落到具体语言。这个习惯在面试里写算法题尤其有用因为你能边说思路边写代码而不是闷头乱写。大O记法是这一章最容易被忽视、又最实用的概念。它的核心不是精确算出运行时间而是看规模增长的趋势。你可以把它理解为当问题规模翻倍时你的程序运行时间大约会变成几倍。复杂度规模翻倍后的趋势常见例子O(1)不变数组按下标访问O(log n)只增加一步二分检索O(n)翻倍顺序查找O(n log n)略多于翻倍快速排序O(n²)变成四倍嵌套循环、选择排序O(2ⁿ)灾难性增长某些穷举问题这个表最好能背下来。它在后面第8章数据抽象和第12章计算理论里会被反复用到。递归是大多数人第一次遇到自己想不通、但机械执行反而很简单的概念。书中用汉诺塔、二分检索树这些例子讲递归关键在于找到两件事递归终止条件和每一步如何缩小问题规模。只要这两个清楚了递归函数基本就成立。我自己学递归的时候推荐过一个笨办法——在纸上手动展开三层调用看每一层的输入输出。展开两三遍之后那种突然通了的感觉就会来。2.2 第6章程序设计语言语言不是语法是设计者的取舍第6章会带你快速走一遍语言的演变史机器语言01串→ 汇编语言助记符→ 高级语言接近人类阅读习惯。这个演变背后就是计算机科学一贯的思路让表达越来越接近人的思维把底层细节留给编译器。书里重点讨论的编译与解释的区别我用一个类比帮你记住编译就像翻译出一整本书再给你看解释就是同声传译说一句翻一句。编译型语言C、Go通常启动快、性能高但跨平台要重新编译解释型语言Python、JavaScript开发灵活但运行时要多一层翻译开销。没有谁更好只有场景匹配不匹配。第6章还会讲到程序设计范式的分野面向过程、面向对象、函数式。这里最值得记住的不是哪个范式高级而是每种范式都在回答一个不同的问题面向过程这件事分成哪几步做典型代表C面向对象这件事涉及哪些对象、它们之间什么关系典型代表Java、Python函数式如何用函数的组合与不可变数据来表达典型代表Haskell、Scala我见过很多初学者把大量精力花在争论Python到底算不算面向对象这类问题上其实方向偏了。语言只是工具第6章真正想让你建立的能力是读懂一种语言的设计动机为什么Java要强类型为什么Python要动态类型为什么Go要把并发写进语法当你开始这样问问题就不只是会写代码而是在读语言设计者的思路。2.3 连着学的正确姿势把伪代码翻译成真代码第5章和第6章是天生一对。我的建议是学第5章时每看完一个算法就用第6章里讲的编程语言去实现一遍并刻意比较伪代码和真实代码的差距。比如教材里会用伪代码描述顺序查找、二分检索、选择排序、快速排序、汉诺塔。你不妨逐个用Python写一遍然后跑一下不同规模的数据感受一下大O记法预测的规模翻倍后时间变化是否真的出现。这一步能把抽象的概念变成肌肉记忆也为第8章数据结构做铺垫。说实话很多同学读完第5章觉得懂了到第8章又觉得怎么数据结构这么难根子往往就在于第5章动手太少。3. 软件工程和数据抽象从能跑的代码到能撑住的系统3.1 第7章软件工程为什么需求分析比写代码更花时间第5、6章解决的是我能不能写出一个程序第7章直接把问题升级成我能不能组织一队人写一个谁都没写过的大型系统。书中提到的软件危机——20世纪六七十年代硬件性能猛涨但软件项目却频频延期、超支、崩溃——原因不是程序员不努力而是复杂性没有方法论来管理。软件工程给出的回答是把软件开发当成一个生命周期。书中介绍的需求分析、设计、实现、测试、维护这几个阶段放到今天的敏捷开发语境下依然成立只是迭代节奏更快了。我特别建议把教材里的瀑布模型和增量模型对比着看瀑布模型适合需求明确、变更成本高的项目增量模型适合需求会演化、想早点看到部分成果的项目。现实中几乎没有纯粹的瀑布往往都是整体规划增量交付。模块化设计里的高内聚、低耦合可能是这一章最值得反复琢磨的八个字。用一个做菜的类比高内聚是每一道菜在自己灶台上做完整低耦合是各灶台之间只通过传菜口传递成品不要互相去碰对方的锅。你在后面写任何稍大一点的系统都会感受到这八个字的分量。3.2 第8章数据抽象数据结构是根据场景选容器很多人觉得数据结构就是背会栈、队列、树、图的定义其实第8章的名字叫数据抽象强调的是把数据的逻辑组织和底层的具体实现分开。我举个例子栈的逻辑定义是后进先出只要满足这个规则底层你可以用数组也可以用链表甚至可以手写一个类。函数调用的底层机制、浏览器的后退按钮、代码编辑器的撤销Undo功能全部是栈的应用。队列是先进先出打印任务、消息队列、秒杀系统的请求排队背后都是它。二叉检索树的核心优势是每次比较都能排除一半可能所以平均查找复杂度是O(log n)。这和第5章二分检索的思想是同一个。图擅长表达关系和路径社交网络的好友关系、地图导航的最短路径都是图的典型场景。这里我想多说一句教材里的栈、队列、树、图是抽象数据类型而用数组还是链表去实现它们是实现策略。很多同学考试能默写定义但做项目时遇到该选什么数据结构还是懵正是因为把这两层混在一起了。正确的思考顺序是先看应用场景需要什么操作插入、删除、查找的优先级是什么再选满足这些操作的抽象数据类型最后才考虑底层实现。3.3 把这两章的知识用起来的三个问题学完第7、8章你最好能回答这三个问题你手头正在写的代码如果划分成模块每个模块的接口是什么改动一个模块的内部实现会不会影响其他模块这是软件工程的高内聚低耦合你最近处理的一批数据如果只能开一个容器你会选数组、链表、栈、队列、树还是图为什么这是数据结构选型如果一个需求说需求可能会变很多你会先写完整设计文档还是先搭一个最小原型这是开发模型的选择能把这三个问题想清楚第7、8章就没白读。它们是后面理解数据库索引、操作系统调度、消息队列、搜索引擎的基础。4. 数据库和图形学数据如何被组织、世界如何被呈现4.1 第9章数据库关系模型为什么是表格但不止是表格如果你只看市面上那些三天学会SQL的教程你大概率会把数据库理解成Excel的高级版本。但书里的第9章会非常明显地纠正这个错觉。传统文件存储最大的问题不是存不下而是数据冗余和不一致同一个用户的地址存在订单表、会员表、快递表三份文件里改的时候漏改一份系统就出矛盾了。关系模型解决这个问题靠的是三个东西表结构行、列、主键、表与表之间的关系外键、完整性约束比如用户名不能为空、订单金额必须大于0。关系代数选择、投影、连接这些运算是描述怎么从表里取数据的数学基础SQL只是把这套运算翻译成人能读的语言。所以你会看到很多数据库面试题不问select怎么写而问这条查询的底层走了什么运算。书中关于数据库设计的部分实体-联系模型E-R图是画设计图的工具规范化则是消除冗余的规则——典型例子就是学生选课这种多对多关系必须拆成学生表课程表选课表三张表否则一个学生选三节课就要在三行里重复存学生姓名。这个思想你在做任何后台管理系统的表设计时都会用到。4.2 第10章计算机图形学你怎么把三角形变成一帧画面第10章可能是很多人觉得用不上的章节但恰恰是它能帮你解释清楚为什么显卡会烧钱。图形学的核心问题可以概括为怎么把一个三维世界描述变成屏幕上一个个像素的颜色。教材里会先讲最基础的光栅化画一条线段怎么决定中间哪些像素该点亮书里介绍的Bresenham画线算法核心思路是只用整数加减法避免浮点运算因为每一帧画面里的线段可能有数百万条每一条都做浮点乘法性能就崩了。这个能用整数就不用浮点的思维是算法优化里非常典型的一课。接着是几何变换把一个物体平移、旋转、缩放为什么要用矩阵因为矩阵可以把多次变换叠在一起。程序在每一帧渲染时会一次性算出一个合并变换矩阵再套用到所有顶点上——不然几百万个顶点每个都做十几次独立运算帧率直接掉到个位数。真实感渲染部分会讲到光照模型、纹理映射更高级的光线追踪则是逆向追踪光线模拟光从光源射到物体再反射到眼睛的路径。游戏里光线追踪显卡更贵就是在实时做这种计算。我在读这一章时最大的收获是突然看懂了游戏画面为什么吃GPU以及为什么图形学程序大量用矩阵变换这些以前只知道名词、不懂原理的东西。4.3 这两章的共性都在处理规模爆炸数据库和图形学看起来毫不相关但它们有一个共同点数据规模太大人肉方法不可行。数据库要面对的是几十亿行记录图形学要面对的是每秒钟几百万个三角形。所以你会发现这两章里反复出现的思想是用数学结构来组织、用算法来加速、用分层来简化。对普通程序员来说你未必会去做数据库内核或游戏引擎但读完这两章至少能获得两个判断力看到某个系统慢你会知道先问是不是查询没设计好、数据没组织好而不是盲目加机器看到某个渲染效果卡你会知道这很可能是三角形数量和像素着色器的数学计算量到了极限而不是怪电脑太差。这种知其所以然的能力是概论课能给你的最值钱的东西之一。5. 人工智能和计算理论往前看是星辰大海往外看是铜墙铁壁5.1 第11章人工智能从规则写死到数据驱动这一章的惊艳程度通常取决于你读它的年份。无论你读的是哪一年的版本图灵测试都是开篇绕不开的概念如果一台机器能跟人对话让人分不清对面是人是机就认为它有智能。这个测试虽然一直被批评重表演、轻理解但它给出了一个可执行、可验证的判断标准这在当时非常了不起。教材随后会讲到知识表示与搜索——这是早期专家系统的思路把专家的经验变成一堆If-Then规则再通过搜索树去推理。这套思路在领域窄、规则清楚的场景很有效比如早期的医疗诊断、矿物勘探系统。但它有个致命短板规则要靠人来写覆盖不了无穷的现实变化。所以第11章的重心通常会落到机器学习与其让程序员编写规则不如让机器从大量样本里自己总结规律。神经网络的核心思想也简单一个网络就是一大堆带权重的连接输入数据一层层传递输出结果与正确标签对比后反向调整权重。整个过程不依赖人告诉它规则而是依赖数据中包含的统计规律。从规则到数据驱动这是理解当前AI热潮的认知开关。我建议你读这一章时重点不是背神经元公式而是体会监督学习里的标签从哪来、无监督学习里没有标签怎么聚这层差异。5.2 第12章计算理论哪些问题的做不到是数学注定的第12章是这本书的压轴章也是被最多读者跳过的一章。但我反而认为这一章才是最体现计算机科学四个字分量的地方。图灵机是一种极简的计算模型一条无限长的纸带、一个读写头、一套状态转移规则。它的意义在于图灵机能计算的函数集合恰好覆盖了任何现代计算机能计算的函数集合。也就是说不管你用Python、C还是量子计算机在经典模型里从可计算性的角度它们和图灵机是等价的。这一下子就把计算这个概念从具体机器里抽离出来了。停机问题是图灵机的重要发现不存在一个通用程序能在所有情况下判断任意程序是否会停机。证明思路用到了自指——让程序检测自己如果它会停机就让它死循环矛盾随之而来。这个结果给所有程序员提了个醒有些问题不是还没写出来而是原理上永远写不出来。P与NP问题是全书最后也最迷人的话题。P类问题是能在多项式时间内解决的问题NP类问题是给你一个候选答案你能在多项式时间内验证对不对的问题。举个例子破解密码很难大概率是NP难但验证我试的这串密码对不对却很容易。P是否等于NP是计算机科学领域悬而未决的世纪难题几乎所有现代密码学都建立在P≠NP这个信念之上。万一哪天有人证明了PNP区块链、银行加密、数字签名这些全都要重新设计——这正是第12章的边界感最迷人的地方。5.3 这两章对不做科研的读者有什么用我听到过很多次我又不搞AI、不做理论看这两章干嘛。我的回答是学AI章节能让你在面对某某系统很智能的宣传时多问一句它到底是用规则还是从数据里学的数据从哪来、有没有偏差学计算理论能让你在做技术选型时判断哪些需求是工程上难哪些是数学上不可行。这两章的价值不在立刻能做什么而在你大脑里多了一条评估技术方案的边界线。在这个人人谈论AI和算力的时代读一点人工智能与计算理论的基本框架会帮助你比周围人更少被玄学话术带偏。6. 读完这8章之后我的阅读顺序、笔记方法与实践延伸6.1 一个更顺手的阅读顺序如果你是按顺序从第5章读到第12章当然没问题。但如果你发现某章卡住了我建议你调整一下先读第5章算法和第6章语言然后把第8章数据抽象提上来读——因为它跟算法紧密相关再读第7章软件工程和第9章数据库它们都属于系统构建接着读第11章AI、第10章图形学它们属于应用最后读第12章计算理论作为收尾。这套顺序的逻辑是先用能做的内容建立信心把最抽象的理论放到最后。6.2 做概念连线图而不是抄思维导图很多人读书喜欢抄目录、抄内容抄完就扔。我的方法是做概念连线图只写概念名词然后画线表示关系。比如我读完第5章到第9章后会画出类似这样的连线算法的大O记法 → 决定了数据结构选型 → 决定了数据库索引设计数据抽象 → 让模块之间只看到接口 → 呼应软件工程的高内聚低耦合软件生命周期 → 说明开发不只是写代码 → 反过来解释为什么要先设计再实现这种连线图不需要工整也不需要给别人看它的作用是在你的大脑里建立知识网络。等你三个月后翻这张图能很快重建所有章节的关系比再翻一遍书高效得多。6.3 把书里的概念映射到你手头的项目如果你正在写代码建议在学完每一章后做一次概念映射你写的函数里哪一段可以抽象出算法它的复杂度是多少你调用的某个库内部大概是用什么数据结构实现的你项目的数据库表有没有冗余能不能用规范化思路优化你看到的AI工具它背后的学习范式大概是哪种你优化过的某个性能问题属于P类、NP类还是工程上本来就该用更好的数据结构这些事情不需要你成为专家才能做只要养成把教材概念和眼前的代码联系起来的习惯就行。概念只有在被一次次联接之后才会真正变成你的工具。最后分享一个我自己的土办法每读完一章翻开目录页在章标题旁边写下三个词概括这一章你印象最深的概念。比如第5章我写的是伪代码、大O、递归第12章写的是图灵机、停机、P/NP。三个月后翻目录靠这三个词我能在两分钟内把整章的骨架重建出来。这个方法听起来简单但我试过很多年效果比划几百行重点都好。读这种概论性的书最怕的就是好像都见过细想全忘光抓住骨架是最有效的对抗遗忘的方式。
返回列表