《计算之魂》第1章 毫厘千里之差——大O概念

第一章 毫厘千里之差——大O概念 (1.1,1.2节)

图灵:提出计算机的数学模型
⋅ \cdot 诺伊曼:确定了计算机通用的系统结构
高德纳:奠定了计算机算法的基础

1.1 算法的规范化和量化度量

人类第一台电子计算机:ENIAC——一台专用计算机,专门用于解决研制长程火炮过程中的计算问题。
世界上第一台程序控制的通用电子计算机:EDVAC——涵盖了一种通用的计算机的体系结构。
“冯·诺依曼体系结构”:冯·诺依曼在客观上将计算机分为了软硬件两部分。

早期没有注重程序质量,后面在商业上开始普及后,对程序的合理性、效率、占用资源就开始讲究了。这都需要计算机的算法理论支撑。

高德纳:奠定计算机算法基础的人,牛逼经历如下:

1. 计算机算法分析的鼻祖,提出了评估计算机算法的标准。

2. 编写了计算机科学领域的“圣经”——《计算机程序设计艺术》一书(共4卷)。(一般人就这一项成果就封神了吧…)

3. 迄今为止最年轻的图灵奖获得者。

4. 自己写了一个排版软件,即著名的TeX(后来被人做成了更方便使用的LaTeX)。

5. 硅谷地区众多图灵奖获得者中名气最大、最会编程的人:硅谷地区聚集了很多图灵奖获得者,有一段时间他们每年要进行编程比赛,高德纳总是用一台最慢的计算机获得第一名。
这就是传说中的高德纳(小声bb: 果然强者从不吝啬头发)
这就是传说中的高德纳(小声bb: 果然强者从不吝啬头发)

思考题1.1

世界上还有什么产品类似于计算机,是软硬件分离的?( 难度系数1颗星)
个人作答:

- 智能设备
现在的家居智能化,各种智能家居设备感觉都是软硬件分离,就算不是,也在朝着这个目标发展,比如扫地机器人,智能电饭煲,智能洗衣机等,都是植入软件,然后用wifi控制即可。

- 网络设备
如交换机和服务器(这…似乎也算是计算机?)

1.2 大数和数量级的概念

例子:哪个算法更好
场景1:使用1万个数据进行测试,算法A运行1毫秒,算法B则需要运行10毫秒。
场景2:使用100万个数据进行测试,算法A运行10000毫秒,算法B运行6000毫秒。

看场景1,是A更好;场景2又是B运行速度更快。然而,需要制定一个明确的、一致的标准,而不是不同场景算法好坏不同。

1965年尤里斯·哈特马尼斯(Juris Hartmanis)和理查德·斯特恩斯(Richard Stearns)提出了算法复杂度的概念(二人后来因此获得了图灵奖)。最早将算法复杂度严格量化衡量的就是高德纳,他也因此被誉为“算法分析之父”。今天,全世界的计算机领域都以高德纳的思想为准。

高德纳的思想主要包括以下三个部分:

  1. 在比较算法的快慢时,只需要考虑数据量特别大,大到近乎无穷大时的情况。理由是计算机的发明是为了处理大量的数据的。
  2. 决定算法快慢的因素虽然可能有很多,但是所有的因素都可以被分为两类:
    第一类是不随数据量变化的因素,
    第二类是随数据量变化的因素。
    例如有两种算法:第一种的运算次数是 3 N 2 3N^2 3N2,其中 N N N是处理的数据量;第二种则是 100 N l o g N 100NlogN 100NlogN,其中的3和100都是常数,与数据量 N N N无关,当 N → ∞ N\rightarrow \infty N时, N 2 ≫ N l o g N N^2\gg NlogN N2NlogN,所以第二种的算法比第一种好。(只考虑与数据量有关的因素和数据量特别大的情况)

插播:
例题1.2中 1 0 100 10^{100} 10100的计算:10万= 1 0 5 10^{5} 105 20 20 20个单词的组合可能个数: ( 1 0 5 ) 20 = 1 0 100 (10^{5})^{20}=10^{100} (105)20=10100

讨论算法复杂度时,只考虑N趋近于无穷大时和 N N N相关的那部分。我们可以把一种算法的计算量或者占用空间的大小,写成 N N N的一个函数 f ( N ) f(N) f(N)。这个函数的边界(上界或者下界)可以用数学上的大O概念来限制。
大O概念的定义:如果两个函数 f ( N ) f(N) f(N) g ( N ) g(N) g(N),在 N N N趋近于无穷大时比值只差一个常数,那么它们就被看成同一个数量级的函数。
而在计算机科学中相应的算法,也就被认为是具有相同的复杂度。

  1. 两种算法在复杂度上相差哪怕只有一点点, N N N很大之后,效率可能就差出万亿倍了。
    如果一个算法的复杂度由一高一低的两部分 f ( N ) f(N) f(N) g ( N ) g(N) g(N)组成,即 f ( N ) + g ( N ) f(N)+g(N) f(N)+g(N),后面数量级低的那部分可以直接省略,也就是说 O ( f ( N ) + g ( N ) ) = O ( f ( N ) ) O(f(N)+g(N))=O(f(N)) O(f(N)+g(N))=O(f(N))。这在数学上显然不成立,但是在计算机算法上是被认可的。
思考题1.2

如果一个程序只运行一次,在编写它的时候,你是采用最直观但是效率较低的算法,还是依然寻找复杂度最优的算法?(难度系数2颗星)
个人作答:
这就要看解决问题的具体算法复杂度了,如果典型的 N N N很大,那肯定需要寻找复杂度最优的算法,如上面第3点所说:两种算法在复杂度上相差哪怕只有一点点, N N N很大之后,效率可能就差出万亿倍。所以寻找最优算法效率反而更高。

1.3节笔记链接:
https://blog.csdn.net/weixin_41794514/article/details/126463994?spm=1001.2014.3001.5501

《仙剑奇侠传》之父姚壮宪热情推荐,技术作家孟岩高度评价! 云风也是我在中国最佩服的游戏开发者。看了云风的研发历程,我觉得就是一部中国的游戏程序史,从最早的 Z80 , 6502 , PC8088 , 286 , 386…DOS ,保护模式, Assembler 到 C++ 的整个发展轨迹。这本书可以说横跨了游戏程序的过去、现在和未来。 书中传达的不仅是一些实用的技术经验,更是传达一种理念——虽然研发的环境随着时代而变,但研发的精神是不变的,那就是“在实践中积累”。 ——《仙剑奇侠传》之父 姚壮宪 之前我经常奇怪,云风还非常年轻,他程序思想中的那种老练的智慧是从何处得来的呢?读完这本书之后,我终于明白,还是那句话:“无他,唯手熟耳”。 面对这沉甸甸的作品,我确实感到,这是云风用心写的书。用心写的书,当然出色。 ——技术作家 孟岩 我现在是中国并不成熟的游戏制作行业中的一员,游戏给了我太多,我告诉自己需要做一点事情。分享知识和经验是我的义务,别无它。 ——云风 内容简介 本书忠实地记录了作者十余年来对游戏编程的所思、所感、所悟。全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技术,从非常专业的汇编优化到非常实际的项目管理进行了一次游戏开发的全景探索。 本书不仅适合游戏开发者阅读,也会给所有的开发者和程序爱好者带来启示。 作者简介 云风,时年二十七岁。自幼学习编程,十数年从未间断,对程序设计有所领悟。大学时代开发的游戏图像引擎“风魂”曾用于多家游戏公司的游戏项目。参与过《大话西游》系列、《梦幻西游》、《网易泡泡游戏》的开发。现从事新一代网络游戏引擎的研究与开发,并在游戏模式上做一些新的尝试。 性格开朗,兴趣广泛,好交友,绝非沉浸在计算机世界中的书呆子。国学、历史书籍常备案头,以先贤之教诲修其心;休息时常作户外运动,尤其喜爱攀岩。 目录 第1 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 2.2.1 地图寻路问题 23 2.2.2 博弈问题 27 2.2.3 更为广泛的运用 28 2.3 智能算法 29 2.3.1 遗传算法(Genetic Algorithm) 29 2.3.2 模拟退火算法(Simulated Annealing) 31 2.3.3 禁忌搜索(Tabu Search) 33 2.3.4 人工神经网络 (Artificial Neural Network) 34 2.4 优化 36 2.4.1 质数问题 36 1.4.2 俄罗斯方块竞赛 37 2.5 Apple II上的编程之路 39 第3 编程语言 45 3.1 C 语言 46 3.2 BASIC 50 3.3 C++ 51 3.4 汇编语言 54 3.4.1 概述 55 3.4.2 程序的本质 57 3.4.3 寄存器 58 3.4.4 寻址方式 60 3.4.5 汇编指令 61 3.4.6 C/C++ 语言和汇编 62 3.4.7 小结 63 3.5 其他语言 63 3.5.1 Forth 63 3.5.2 Lisp 64 3.5.3 Java 64 3.5.4 Python、Lua、更多 65 第4 前Windows 时代 67 4.1 386保护模式 68 4.2 VGA 到VESA 70 4.2.1 超越 BGI 70 4.2.2 VGA 72 4.2.3 VESA 标准 72 4.2.4 花絮 74 4.3 保护模式下的开发工具 75 4.4 闲话 Allegro 81 4.4.1 用C与汇编写成的程序库 81 4.4.2 BITMAP 82 4.4.3 Sprite 85 4.4.4 几何图形和 3D 89 4.4.5 数据文件 91 4.4.6 声音 92 4.4.7 其他的部分 93 4.4.8 小结 94 4.5 cfido 中国惠多网 94 第5 Windows 编程 101 5.1 Windows编程入门 104 5.1.1 Windows版本综述 105 5.1.2 操作系统的核心 107 5.1.3 Windows API和DLL 110 5.1.4 COM 111 5.1.5 Windows的窗口和消息处理与传递 114 5.1.6 Windows GDI 125 5.2 控制游戏的速度 130 5.3 浅谈MFC 132 5.4 小结 132 第6 汇编优化 135 6.1 浅谈代码优化 138 6.2 并不仅仅是汇
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值