算法引入的相关知识,内容包括数学:解决问题的终极工具、问题解决的“计算”之道、图灵机计算模型、计算复杂性、计算方法、抽象和实现、算法的表达、为什么要研究和学习算法。
一、数学:解决问题的终极工具
人们在生活、生产、学习、探索、创造过程中会遇到各种未知的事物
- 有些问题已经解决
- 很多问题尚未解决
- 有些问题似乎无法解决
尚未解决和无法解决问题的共性:表述含混、标准不一、涉及主观、结果不确定
数学:解决问题的终极工具
在长期的发展过程中,人么把已经解决的问题逐渐表述为数学命题与模型
- 尚未解决的问题:人们试图通过数学建模,采用数学工具来解决
- 无法解决的问题,人们视图转换表述、明晰问题来部分解决
为什么是数学?
- 数学具有清晰明确的符号表述体系
- 严密确定的推理系统
但正如科学不是万能的,数学也不是万能的。有些问题天然无法明确表述(主观、价值观、意识形态、哲学问题等)有些可明确表述的问题仍然无法解决
二、问题解决的“计算”之道
20世纪20年代,为了解决数学本身的可检验性问题,大数学家希尔伯特提出“能否找到一种基于有穷观点的能行方法,来判定任何一个数学命题的真假”
1. 抽象的“计算”概念提出
基于有穷观点的能行方法:
由有限数量的明确有限指令构成;
指令执行在有限步骤后终止;
指令每次执行都总能得到唯一结果;
原则上可以由人单独采用纸笔完成,而不依靠其它辅助;
每条指令可以机械地被精确执行,而不需要智慧和灵感。
2. 关于“计算”的数学模型
20世纪30年代,几位逻辑学家各自独立提出了几个关于“计算”的数学模型
哥德尔和克莱尼的递归函数模型
丘奇的Lambda演算模型
波斯特的Post机模型
图灵的图灵机模型
3. 关于“计算”的数学模型
研究证明,这几个“基于有穷观点的能行方法”的计算模型,全都是等价的
虽然希尔伯特的计划最终被证明无法实现
不存在“能行方法”可判定所有数学命题的真假
总有数学命题,其真假是无法证明的
但“能行可计算”概念成为计算理论的基础
其中的一些数学模型(如图灵机)也成为现代计算机的理论基础
三、图灵机计算模型
1936年,Alan Turing提出的一种抽象计算模型,基本思想是用机器模拟人们用纸笔进行数学运算的过程,但比数值计算更为简单
1. 图灵机的基本概念
- 在纸上写上或擦除某个符号;
- 把注意力从纸的一个位置转向另一个位置
- 在每个阶段,要决定下一步动作依赖于:(a) 此人当前所关注的纸上某个位置的符号和 (b) 此人当前思维的状态。
2. 图灵机的基本定义
一条无限长的分格纸带,每格可以记录1个符号。一个读写头,可在纸带上左右移动,能读出和擦写格子的字符。一个状态寄存器,记录有限状态中的1个状态
// 一系列有限的控制规则:
• 某个状态,读入某个字符时:
• 要改写成什么字符
• 要如何移动读写头
• 要改变为什么状态
3. 举例子
判定{ambm|m>=0}:左半部全是a,右半部全是b,且ab数量相等的字符串
规则思路:读写头来回移,将a和b一一对消,如果最后剩下空白B则接受,否则拒绝
初始状态s0是读写头停在第一个字符处
s1状态是读写头正在右移
s2状态是读写头到字符串最右边
s3状态是读写头正在向回左移
判定ambm模式串图灵机的规则
<s0, a, B, s1, R>:初始碰到a消去,s1,右移
<s1, a, a, s1, R>:消去1个a的状态,继续右移,找最后一个b
<s1, b, b, s1, R>:遇到b,继续右移
<s1, B, B, s2, L>:右移到尾,状态s2,回移
<s2, b, B, s3, L>:如果有b,消去,进入左移状态s3
<s3, b, b, s3, L>:左移遇到b,继续左移
<s3, a, a, s3, L>:左移遇到a,继续左移
<s3, B, B, s0, R>:左移到头回初始状态s0,右移检查下个字符
<s0, B, B, sY, N>:a,b都能一一消完,则进入“接受”状态,停机
<s0, b, b, sN, R>:b多了,或者b在a前,进入“拒绝”状态,停机
<s2, a, a, sN, R>:s2是末尾状态,如果碰到a,表示a多了,或者a在b后,进入“拒绝”状态,停机
<s2, B, B, sN, R>: s2是末尾状态,如果没碰到b,表示a多了,进入“拒绝”状态,停机
四、计算复杂性
1. 问题的分类
- What:是什么? 面向判断与分类的问题
- Why:为什么? 面向求因与证明的问题
- How:怎么做? 面向过程与构建的问题
2. 可以通过“计算”解决的问题
用任何一个“有限能行方法”下的计算模型可以解决的问题,都算是“可计算”的
What 分类问题: 可以通过树枝的判定分支解决
Why 证明问题: 可以通过有限的公式序列来解决
How 过程问题: 可以通过算法流程来解决解决问题的过程
3. 计算复杂性
计算复杂性理论研究问题的本质,将各种问题按照其难易程度分类,研究各类问题的难度级别,并不关心解决问题的具体方案
而算法则研究问题在不同现实资源约束情况下的不同解决方案,致力于找到效率最高的方案
4. 不可计算问题
有不少定义清晰,但无法解决的问题。 并不是尚未找到解,而是在“基于有穷观点的能行方法”的条件下,已被证明并不存在解决方案
停机问题: 判定任何一个程序在任何一个输入情况下是否能够停机
不可计算数: 几乎所有的无理数,都无法通过算法来确定其任意一位是什么数字。可计算数很少:如圆周率Pi,自然对数的底e
五、计算方法
1. 超大规模分布式计算
SETI@home是一项利用全球联网计算机共同搜寻地外文明(SETI)的科学实验计划。项目组把射电望远镜采集到的海量信息分成一个个小数据包,发送到互联网上每台安装了SETI@home软件的电脑都可以自动下载这些数据,以运行屏幕保护或者后台程序的方式参与数据分析。从1999年5月开始,目前,有170万人、450万台计算机正在参加搜寻
2. 新型计算技术:光子计算
用超微透镜取代晶体管、以光信号代替电信号进行运算
光芯片无需改变二进制计算机的软件原理,但可以轻易实现极高的运算频率,同时能耗非常低,不需要复杂的散热装置
3. 新型计算技术:DNA计算
以DNA分子和酶的相互作用实现逻辑运 算和数据存储,获得极高的计算并行度和 存储能力。
4. 新型计算技术:量子计算
利用量子力学态叠加原理,让信息单元处 于多种可能性的叠加状态,从而实现指数 级别的并行计算,根本上解决最高复杂度 计算问题。
5. 分布式智慧——众包
Foldit:游戏化众包蛋白质结构分析
多人在线游戏,众多玩家在给定一个目标蛋白的情况下,用各种氨基酸进行组装,最终拼凑出这个蛋白的完全体
玩家只需要掌握基本方块的拼插技巧,即可跟全世界众多玩家一起协同工作,攻克科研难题,有60万人玩过这个游戏
六、抽象和实现
1. 抽象的概念
计算机科学主要研究的是问题、问题解决过程,以及问题的解决方案,包括了前述的计算复杂性理论以及对算法的研究
为了更好地处理机器相关性或独立性,引入了“抽象”的概念,用以从“逻辑 Logical ”或者“物理 Physical ”的不同层次上看待问题及解决方案
2. 抽象的例子
汽车
司机看到汽车的“逻辑” 层次,这些操纵机构(方向盘、油门、档位)就称为“ 接口 Interface”
从汽车修理工的角度来看同一辆汽车,这些内部构造构成了汽车的“物理” 层次,工作过程就称为“实现 Implementation”
计算机
从一般大众用户观点看来,计算机可以用来编辑文档、收发邮件、上网聊天、处理照片等等,并不需要具备计算机内部如何处理的知识,利用这些功能是计算机的“逻辑”层次
而对于计算机科学家、程序员、技术支持、系统管理员来说,就必须要了解从硬件结构、操作系统原理到网络协议等各方面的低层次细节,内部如何实现,是计算机的“物理”层次
“抽象”发生在各个不同层次上
即使对于程序员来说,使用编程语言进行编程,也会涉及到“抽象”,如计算一个数的平方根,程序员可以调用库函数math.sqrt,直接得到结果,而无需关心其内部是如何实现,这种功能上的“黑盒子”称作“过程抽象 Procedural Abstraction”
3. 抽象与实现:编程
编程是通过一种程序设计语言,将抽象的算法实现为计算机可以执行的代码的过程,没有算法,编程无从谈起(这句话可以推出——“算法是抽象的”)
图灵奖获得者Niklaus Wirth的著名公式:算法+数据结构=程序。此公式相当于物理中的E=mc^2,Pascal语言设计者
4. 实现算法的基本机制
程序设计语言需要为算法的实现提供实现“过程”和“数据”的机制,具体表现为“控制结构”和“数据类型”
程序设计语言均有语句对应控制结构,顺序处理、分支选择、循环迭代
程序设计语言也提供最基本的数据类型来表示数据,如整数、字符等,但对于复杂的问题而言,直接使用这些基本数据类型不利于算法的表达
七、算法的表达
为了控制问题和问题解决过程的复杂度,利用抽象来保持问题的“整体感”而不会陷入到过多的细节中去,这要求对现实问题进行建模的时候,对算法所要处理的数据,也要保持与问题本身的一致性,不要有太多与问题无关的细节
1. 数据抽象:ADT抽象数据类型
过程抽象”启发我们进行“数据抽象”
相对于程序设计语言中基本数据类型,抽象数据类型(ADT:Abstract Data Type)。ADT是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理
抽象数据类型ADT建立了一种对数据的 “封装 Encapsulation”,封装技术将可能的处理实现细节隐蔽起来能有效控制算法的复杂度
2. 数据结构是对ADT的具体实现
同一ADT可以采用不同的数据结构来实现,采用程序设计语言的控制结构和基本数据类型来实现ADT所提供的逻辑接口——属于ADT的“物理”层次
3. ADT实现:数据结构Data Structure
对数据实现“逻辑”层次和“物理”层次的分离,可以定义复杂的数据模型来解决问题,而不需要立即考虑此模型如何实现
八、为什么要研究和学习算法
在某些情况下,当我们碰到棘手的难题,得能区分这种问题是根本不存在算法,还是能找到算法,但需要耗费大量的资源
某些问题解决需要一些折衷的处理方式,我们需要学会在不同算法之间进行选择,以适合当前条件的要求
「资料来源:©数据结构与算法Python版-中国大学MOOC」