读普林斯顿计算机公开课03算法

读普林斯顿计算机公开课03算法

1. 软件

1.1. 计算机是一种通用机器,能够执行任何计算

  • 1.1.1. 只有很少的指令,但执行这些指令的速度却极快,而且它能够在很大程度上控制自己的运行

1.2. 计算机自己不会做任何事情,除非有人极其详细地告诉它该做什么

  • 1.2.1. 计算机是魔法师的好学徒,能够不知疲倦地遵循指令而不出错,但需要极其精确给出关于具体如何做的说明

1.3. 软件是指令序列的总称,这些指令序列能让计算机做一些有用的事情

  • 1.3.1. 是无形的,不能用手触摸到

1.4. 传统观点认为,软件比硬件更便宜、更灵活、更容易更改,特别是在某些设备出厂后

  • 1.4.1. 使用软件来改变物理行为并不那么简单

1.5. 通过软件创建特定的行为

  • 1.5.1. 防抱死和电子稳定控制这样的不同功能显然都是软件的特色

1.6. 737MAX

  • 1.6.1. 737MAX于2017年投入使用

  • 1.6.2. 波音公司没有进行空气动力学方面的修改以保持其性能接近早期型号,而是开发了一种自动飞行控制软件系统,称为机动特性增强系统(MCAS)

  • 1.6.3. 目的是让MAX像其他737一样飞行,因此不需要重新认证,飞行员也不需要重新培训

  • 1.6.3.1. 这两个过程都很昂贵,而软件会让新飞机就和老飞机一样

  • 1.6.4. 为了简化复杂的情况,更重和重新定位的发动机改变了MAX的飞行特性

1.7. 计算机是关键系统的中心,而软件控制着它们

1.8. 医学成像系统使用计算机来控制信号并形成图像供医生解释,而胶片已经被数字图像所取代

1.9. 军事武器和后勤系统完全依赖于计算机,世界金融系统也是如此

1.10. 网络战和间谍活动是真正的威胁

  • 1.10.1. 2010年的震网蠕虫病毒摧毁了伊朗的铀浓缩离心机

  • 1.10.2. 2015年12月,乌克兰发生了一起大规模停电事件

  • 1.10.3. Petya的勒索软件进行的第二轮攻击干扰了乌克兰的各种服务设备

  • 1.10.4. “想哭”(WannaCry)的勒索软件攻击

1.11. 如果软件不可靠、不健壮,我们就有麻烦了,而且随着我们越来越依赖软件,情况只会变得更糟

  • 1.11.1. 逻辑或实现中的任何错误或疏忽都可能导致程序行为不正确,即使在正常使用中不会发生这种情况,也可能会给攻击者留下漏洞

2. 算法

2.1. 算法就是保证特定计算过程正确执行的一系列步骤,它是计算机科学中的菜谱或纳税申报表,只不过编制得更仔细、更准确、更清楚

  • 2.1.1. 菜谱比任何程序都含糊不明,容易产生歧义

2.2. 算法的每一步都表达为一种基本操作,其含义都是完全确定的

  • 2.2.1. 任何事物的含义都没有歧义,输入数据的性质也是既定的

  • 2.2.2. 算法会涵盖所有可能的情况,绝不会遇到一种它不知道接下来该做什么的情况

2.3. 设计、分析和实现高效的算法是学院派计算机科学的核心工作,而在现实世界中也有很多非常重要的算法

2.4. 线性算法

  • 2.4.1. 算法的一个关键属性是其运行效率有多高

  • 2.4.2. 如果计算时间与数据量成正比或线性比例,那该算法就称为线性时间算法或就是线性算法

2.5. 二分查找

  • 2.5.1. 二分查找的关键是数据量的增长只会带来工作量的微小增长

  • 2.5.2. 二分法经常出现在现实世界中,比如许多体育运动中使用的淘汰赛

2.6. 排序

  • 2.6.1. 排序,把数据按顺序排好,后续查找才能更快

  • 2.6.2. 选择排序算法

  • 2.6.2.1. 选择排序的工作量与N2+N成正比

  • 2.6.2.2. 随着N不断增大,N2最终会比N大得多

  • 2.6.2.3. 结果就是工作量近似地与N2即N的平方成正比

2.6.2.3.1. 这个增长率叫作二次增长

2.6.2.3.2. 二次增长比线性增长要差,事实上差得很远

  • 2.6.3. 快速排序算法

  • 2.6.3.1. Quicksort

  • 2.6.3.2. 是英国计算机科学家托尼·霍尔在1962年前后发明的

  • 2.6.3.3. 霍尔获得了1980年的图灵奖,获奖理由是包括快速排序在内的多项贡献

  • 2.6.3.4. 快速排序是一种优雅的算法,也是分而治之的一个绝佳示例

  • 2.6.3.5. 快速排序在对N个数据项排序时,要执行N logN次操作,即工作量与N log N成正比

  • 2.6.3.6. 在N特别大的情况下,它比二次增长或N2增长则好太多了

2.7. 难题和复杂性

  • 2.7.1. 一个极端是log N,如在二分查找中所见,表示随着数据量的增加,工作量的增长非常缓慢

  • 2.7.2. 最常见的情况是线性增长,或者说简单的N,此时工作量与数据量是成正比的

  • 2.7.3. 然后是快速排序的N log N,比N差(增长更快)​,但在N值非常大的情况下仍然特别实用,因为对数因子增长得很慢

  • 2.7.4. 还有就是N2,或者二次增长,增长速度太快了,让人无法忍受,几乎不怎么实用

  • 2.7.5. 指数级增长,数学表达式为2^N

  • 2.7.5.1. 指数级算法的工作量增长极快:增加一个数据项,工作量就会翻一番

  • 2.7.5.2. 指数级算法与log N算法是两个极端,后者数据项翻一番,工作量才增加一步

  • 2.7.5.3. 密码学中的算法,都是让特定计算任务具有指数级难度的

  • 2.7.5.4. 现实中大量的问题或者说很多实际的问题似乎都需要指数级算法来解决

  • 2.7.6. “NP”问题

  • 2.7.6.1. NP问题的特点是,我们可以快速验证某个提出的解决方案是否正确,但要想迅速找到一个解决方案却很难

  • 2.7.6.2. 旅行推销员问题(Traveling Salesman Problem, TSP)

  • 2.7.6.3. 1971年,斯蒂芬·库克证明了一个重要的数学结论,显示了所有这些问题其实都是等价的,只要我们找到一个多项式时间算法(复杂性类似N2)解决其中一个问题,那我们据此就能找到所有问题的多项式时间算法

2.7.6.3.1. 库克因为这项工作获得了1982年的图灵奖

  • 2.7.6.4. 在大多数情况下,一个近似的解决方案可能就足够好了,完全没有必要追求一个绝对的最佳方案

2.7.6.4.1. 在现实生活中,N可能小到足以使渐近行为无关紧要

  • 2.7.6.5. 一些如加密系统的重要应用,则完全是建立在认为某个特定的问题确实极难解决的基础之上的

2.7.6.5.1. 若能发现出一种攻击方法,无论其在短时间内是多么不切实际,也都是意义非凡的

2.8. 算法和复杂性的研究是计算机科学的一个重要组成部分,无论是理论还是实践

  • 2.8.1. 我们感兴趣的是什么可以计算,什么不能计算,以及如何在不占用不必要内存的情况下快速计算,或者在速度和内存之间进行权衡

2.9. 算法也是语音理解、人脸及图像识别、语言机器翻译等服务的核心

  • 2.9.1. 这些都依赖于能够挖掘出相关特征的大量数据,因此,算法必须是线性的或更优的,通常必须是并行的,以便不同的部分能在多个处理器上同时运行
posted @ 2026-06-23 06:52  躺柒  阅读(2)  评论(0)    收藏  举报