数据结构与算法(一):初识算法和计算模型
算法
计算、计算机和算法是什么?
计算:信息处理
借助某种工具,遵照一定规则,以明确而机械的形式进行
计算模型:计算机 = 信息处理工具
算法:即特定计算模型下,旨在解决特定问题的指令序列
-
输入 待处理的信息(问题)
-
输出 待处理的信息(问题)
-
正确性 的确可以解决指定的问题
-
确定性 任一算法都可以描述为一个有基本操作组成的序列
-
可行性 每一基本操作都可以实现,且在常数时间内完成
-
有穷性 对于任何输入,经过穷次基本操作,都可以得到输出
什么才是好算法?
-
正确:
-
符合语法,能够编译、链接
-
能够正确处理简单的输入
-
能够正确处理大规模的输入
-
能够正确处理一般性的输入
-
能够正确处理退化的输入
-
能够正确处理任意合法的输入
-
健壮:能够辨别不合法的输入并做适当的处理,而不致非正常退出
-
可读:结构化+准确命名+注释 ...
-
效率:速度尽可能快,存储空间尽可能少
算法 + 数据结构 = 程序
(算法 + 数据结构)X 效率 = 计算
不会算法(上)和会算法(下)的区别
计算模型
为什么需要计算模型?
同一问题通常有多种算法,如何评判其优劣?
实验统计是最直接的方法,但不足以准确反映算法的真正效率,因为不同的算法可能更适应于不同规模或不同类型的输入,而同一算法也可能有不同程序员、用不同程序语言、经不同编译器实现,也可能实现并运行于不同的体系结构、操作系统 ...
为了给出客观的评判,需要抽象出一个理想的平台或模型
不再依赖于上述种种具体的因素,从而直接而准确地描述、测量并评价算法
计算模型为什么准确?
在传统的实验统计中,我们通过算法的运算时间来评判算法的效率,而计算模型则是通过算法需要执行的基本操作次数来评判算法的效率。
图灵机(Turing Machine)
图灵机五大要件:
-
Tape:一条无限长的纸袋,依次均匀地划分为单元格,各注有某一字符,默认为'#'
-
Alphabet:字符的字符表,字符的种类是有限的
-
Head:读写头,总是对准某一单元格,并可读取和改写其中的字符,每经过一个节拍,可转向左侧或右侧的邻格
-
State:状态,图灵机总是处于有限状态中的某一种,每经过一个节拍,可(按照规则)转向另一种状态
-
Transition Function (q,c;d,L/R,p):读写头的指示器,控制读写头的操作
若当前状态为 q 且当前字符为 c,则将当前字符改写为 d ;转向左侧/右侧的邻格;转入 p 状态,一旦转入特定的状态‘h',则停机
简单实例
RAM(Random Access Memory)
RAM计算模型介绍:
一个RAM由k个变址器I1,I2,…,Ik、无穷个普通寄存器R0,R1,R2,…和一个有穷长的程序所组成。变址器也是寄存器,每个寄存器中可以存放一个自然数,但只有变址器的内容可以作为间接地址。
RAM的程序使用两种形式的地址。一种是直接地址,形式为Ij(j=1,2,…,k)或Ri(i=0,1,2,…);另一种是间接地址,形式为Ij(j=1,2,…,k)。如果Ij中存的自然数为i,则Ij代表地址Ri。
RAM的指令为下列形式之一:
①A←a,表示把地址A的内容改为自然数a;
②A←B,表示把地址A的内容改为地址B的内容;
③A←B*C,表示把地址B中的内容和地址C中的内容作为运算之后,送入地址A*。
这里*可以是自然数的加法、减法、乘法或整数除法。
减法的定义为:若a≥b则等于a-b,否则等于0;
④A←F(B,C),此处F是一个可以用多带图灵机器在多项式空间和对数多项式的巡回中实现的变换。A、B、C可以是直接地址,也可以是间接地址。A是写入地址,B、C是读出地址。
RAM除了可以用以上的指令编程序外,还可以判断某个寄存器或变址器的内容是否为0,以实现条件转移。
变址器是用来实现间接地址的,所以要求在运算过程中变址器中所存的自然数不大于所用到的普通寄存器数目的某个常数倍。
简单实例
翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)译