一.解决一个计算问题的过程
二.计算,算法,问题
定义1(计算): 可由一个给定计算模型机械地执行的规则或计算步骤序列称为该计算模型的一个计算
定义2**(算法)**: 算法是一个满足下列条件的计算 :
- 终止性:有限步内必须停止(有穷性)
- 确定性:每步都是严格定义和确定的动作
- 能行性:每个动作都能被精确地机械执行
- 输 入:具有满足给定约束条件的输入
- 输 出:产生满足给定约束条件的结果.
定义3 ( 问题) 设Input和Output是两个集合.一个问题是一个关系P InputOutput.同时P也可以表示为以下形式
P == {},即P表示为一个二元组集合
Input称为问题P的输入集合,Input的每个元素称为P的一个输入,Output称为问题P的输出或结果集合,Output的每个元素称为P的一个结果.
问题定义了输入和输出的关系,并不涉及具体数据,问题的实例才设计具体数据
如排序问题: SORT = {}
定义4( 问题实例). 问题P 的一个实例是P 的一个二元组.
二元组(<9,6,7,3>,< 3,6,7,9>)是 SORT 问题的一个实例
问题和问题的实例:
1.问题是一个二元组集合,问题实例是一个二元组
2.一个算法求解一个 完整的问题 ,而不是仅求解一个问题的一个或几个实例 .
定义6 ( 输入的大小). 设Input是问题P的输入集合,P的输入大小是一个函数F:InputN,N是正整数集合.
三.问题的分类: P, NP, NP-C, NP-H, Non-NP
规约/约化
问题A是问题B的子集,即问题A包含在问题B中,称为“问题A可规约为问题B”.
求解一元一次方程和求解一元二次方程。那么我们说,前者可以规约为后者,即知道如何解一个一元二次方程那么一定能解出一元一次方程。
从规约的定义中我们看到,一个问题规约为另一个问题,时间复杂度增加了,问题的应用范围也增大了。
通过对某些问题的不断规约,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。
存在这样一个NP问题,所有的NP问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的NP问题都解决了。
这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC问题,也就是NP-完全问题。
P类问题:能在多项式时间内可解的问题。(等价于: 确定性计算机”能够在“多项式时间”解决的所有问题.)
NP类问题:在多项式时间内“可验证”的问题。(等价于: 非确定性计算机”能够在“多项式时间”解决的所有问题.)
也就是说,不能判定这个问题到底有没有解,而是猜出一个解来在多项式时间内证明这个解是否正确。即该问题的猜测过程是不确定的,而对其某一个解的验证则能够在多项式时间内完成。P类问题属于NP问题,但NP类问题不一定属于P类问题。
NPC问题:1.存在这样一个NP问题 2.所有的NP问题都可以约化成它。
换句话说,只要解决了这个问题,那么所有的NP问题都解决了。
NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。
NP -Hard问题:所有的NP问题都可以约化成的问题.
就是说,NP-Hard问题要比 NPC问题的范围广,NP-Hard问题没有限定属于NP
Non-NP问题:在多项式时间内无法验证的问题.(等价于: 非确定计算机不能再多项式时间内求解的问题)
“NP难题”: 若一个问题在多项式时间内可验证, 那么它在多项式时间内是否一定可解?
即证明或推翻P=NP
四.算法的设计
以下是设计算法时可以采用的方法,这些方法不仅仅是是针对特定问题的算法,而是对所有符合要求都可以使用的方法.
- Divide-and-Conquer
- Dynamic Programming
- Greedy Algorithms
- Tree Searching Strategies
- Genetic Algorithms
- Annealing
- Approximation Algorithms
- Randomlized Algorithms
- On-Line Algorithms
- Parellel Algorithms
五.算法的分析
- 算法的正确性分析
- 算法的复杂性分析
算法的正确性分析
定义5 ( 算法正确性). 一个算法是正确的,如果它对于每一个输入都最终停止,而且产生正确的输出.
不正确的算法: 1.存在输入使其不停止 2.存在输入使其得出错误结果
程序调试只能证明算法错误,不能证明算法正确
如何证明算法的正确性:
普通算法的正确性:1.对所有输入都停止 2.对所有输入都产生正确的结果
近似/随机算法的正确性: 1.对所有输入都停止 2.对所有输入都产生近似正确/极少数不正确解
算法的复杂性分析
• 目的: 分析算法对不同输入所需资源量,为求解一个问题选择最佳算法、最佳设备
• 复杂性测度:
– 时间、空间、I/O等
– 是关于输入大小的函数
问题的复杂性可研究那些方面?
•固有复杂性
•复杂性上 、 下界
•平均复杂性
•复杂性问题的分类 P=NP?
•公理复杂性理论:抽象复杂性研究
定义7 (实例时间复杂性). 一个算法对定输入的时间复杂性是该算法对该输入产生结果需要的原子操作数.
时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当程序所处理的问题规模扩大后,程序需要的时间长度对应增长得有多快。
具有O(1) 的时间复杂度: 意味着程序执行时间与问题规模无关,不会随问题规模的变大而耗时增加
具有O(n) 的时间复杂度:意味着程序执行时间与问题规模的增长而线性增长
多项式的时间复杂度为
定义8 (实例空间复杂性). 一个算法对特定输入的空间复杂性是该算法对该输入产生结果所需要的存储空间大小.
时间复杂性是输入大小的函数T(n)
空间复杂性是输入大小的函数S(n)
定义9 ( 算法最坏复杂性). 设Input是问题P的输入集合,Complexity(Size(x))是求解P的实例x的算法A的复杂性函数,A的最坏复杂性是Max{Complexity(size(x)) | x Input}
定义10 ( 算法最好复杂性).Min{Complexity(size(x))|x Input }
定义11 ( 算法平均复杂性). 设x ∈ Input, x作为算法A的输入出现的概率是 ,
A的平均复杂性为 complexity(size( x))