文章目录
算法与程序
算法概述
- 算法是解决问题的一种方法或一个过程。
- 算法是若干指令的有穷序列。
- 算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程。
- 算法是对计算机上执行的计算过程的具体描述。
算法的性质
- 输入:算法的输入由零个和多个外部量提供。
- 输出:算法产生至少一个量作为输出。
- 确定性:组成算法的每条指令清晰、无歧义。
- 有限性:算法中每条指令的执行次数和执行时间都是有限的。
程序概述
程序是算法用某种程序设计语言的具体实现。
注意:程序可以不满足算法的第4条性质“有限性”,即程序可以是无限循环的。
例如操作系统就是一个在无限循环中执行的程序。
研究算法的必要性
高效的算法可以节省时间和存储空间
算法复杂性分析
算法分析概述
算法分析是研究算法对计算机资源进行使用的理论,是对算法运行所需要的计算机资源的量的预测。
算法复杂性
算法复杂性即算法运行所需要的计算机资源的量。
- 需要时间资源的量称为时间复杂性T(n)。
- 需要空间资源的量称为空间复杂性S(n)。
- n为问题的规模,即输入的大小。
研究算法的复杂性(性能、效率)的必要性
- 性能有时决定系统是否可行。
实时系统中若性能低下,则导致系统不可行。
- 性能是许多重要特性的基础。
如:用户体验。
算法分析的基本问题
-
怎样评价一个问题的难易程度?
-
怎样评价一个算法的好与坏?
-
对于一个问题怎样知道哪个算法是最优的?
即解同样的问题是否存在其他更好的算法
算法执行时间相关的因素
- 问题的规模(N)
排序问题中,需要排序的数:10 vs.
- 算法的输入(I)
排序问题中,输入已排序、逆序的情况
- 算法选用的策略(A)
T(N,I,A),算法执行时间和问题的规模、算法的输入、算法选用的策略有关
算法的时间复杂性
最好情况
Tmin (n): 输入规模为n时,程序运行可能消耗的最短时间
具有欺骗性,可能只对某些特定输入起作用
最坏情况
Tmax (n): 输入规模为n时,程序运行可能消耗的最长时间
可视为对用户提供的一种承诺
平均情况
Tavg(n): 输入规模为n时,所有可能输入的期望时间
期望时间:每种可能出现的输入消耗的时间*出现的概率
以上三种情况衡量算法的时间复杂性可操作性最好,具有实际价值。
算法的渐进复杂性
渐进复杂性:复杂性中的最高阶项
对算法的分析主要是考虑算法的渐进复杂性
NP完全性理论
计算模型
在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型,包括定义该计算模型中所用的基本运算。
建立计算模型的目的是为了使问题的计算复杂性分析有一个共同的客观尺度。
2个基本计算模型:
- 随机存取机RAM(Random Access Machine)
- 图灵机(Turing Machine)
这2个计算模型在计算能力上是等价的,但在计算速度上是不同的。
随机存取机RAM
RAM的结构
RAM程序
一个RAM程序定义了从输入带到输出带的一个映射。可以对这种映射关系做两种不同的解释。
- 解释一:把RAM程序看成是计算一个函数
若一个RAM程序P总是从输入带前n个方格中读入n个整数x1,x2,…,xn,并且在输出带的第一个方格上输出一个整数y后停机,那么就说程序P计算了函数f(x1,x2,…,xn)=y。
- 解释二:把RAM程序当作一个语言接受器
将字符串S=a1a2…an放在输入带上。在输入带的第一个方格中放入符号a1,第二个方格中放入符号a2,…,第n个方格中放入符号an。然后在第n+1个方格中放入0,作为输入串的结束标志符。如果一个RAM程序P读了字符串S及结束标志符0后,在输出带的第一格输出一个1并停机,就说程序P接受字符串S。
图灵机
根据有限状态控制器的当前状态及每个读写头读到的带符号,图灵机的一个计算步可实现下面3个操作之一或全部:
-
改变有限状态控制器中的状态
-
清除当前读写头下的方格中原有带符号并写上新的带符号
-
独立地将任何一个或所有读写头,向左移动一个方格(L)或向右移动一个方格®或停在当前单元不动(S)
k带图灵机可形式化地描述为一个7元组(Q,T,I,,b,,),其中:
-
Q是有限个状态的集合。
-
T是有限个带符号的集合。
-
I是输入符号的集合,IT。
-
b是唯一的空白符,bT-I。
-
是初始状态。
-
是终止(或接受)状态。
-
是移动函数。它是从Q的某一子集映射到 Q(T{L,R,S})的函数。
与RAM模型类似,图灵机既可作为语言接受器,也可作为计算函数的装置。
图灵机M的时间复杂性T(n)是它处理所有长度为n的输入所需的最大计算步数。如果对某个长度为n的输入,图灵机不停机,T(n)对这个n值无定义。
图灵机的空间复杂性S(n)是它处理所有长度为n的输入时,在k条带上所使用过的方格数的总和。如果某个读写头无限地向右移动而不停机,S(n)也无定义。
P类与NP类问题
一般地说,将可由多项式时间算法求解的问题看作是易处理的问题(例如排序),而将需要超多项式时间才能求解的问题看作是难处理的问题(例如汉密尔顿回路判定问题和旅行售货商最短路径求解问题)。
有许多问题,从表面上看似乎并不比排序或图的搜索等问题更困难,然而至今人们还没有找到解决这些问题的多项式时间算法,也没有人能够证明这些问题需要超多项式时间下界。
在图灵机计算模型下,这类问题的计算复杂性至今未知。
为了研究这类问题的计算复杂性,人们提出了另一个能力更强的计算模型,即非确定性图灵机计算模型,简记为NDTM(Nondeterministic Turing Machine)。
在非确定性图灵机计算模型下,许多问题可以在多项式时间内求解。
非确定性图灵机
在图灵机计算模型中,移动函数是确定性的值,即对于Q中的每一个值,当它属于的定义域时,Q(T{L,R,S})中只有唯一的值与之对应,称这种图灵机为确定性图灵机,简记为DTM(Deterministic Turing Machine)。
非确定性图灵机( NDTM ):一个k带的非确定性图灵机M是一个7元组:(Q,T,I,,b,,)。与确定性图灵机不同的是非确定性图灵机允许移动函数具有不确定性值。
确定性和非确定性图灵机的区别在于:确定性图灵机的每一步只有一种选择,而非确定性图灵机可以有多种选择。因此,非确定性图灵机的计算能力比确定性图灵机强的多。
P与NP
P代表Polynomial,意为在**(确定性)多项式时间内可解的问题。**
NP里面的N,不是Non-Polynomial的N,是Non-Deterministic ,意为是非确定的。
NP就是Non-deterministic Polynomial-time的问题,也即是非确定性多项式时间内可解的问题。
P类与NP类语言
P类和NP类语言的定义:
P={L|L是一个能在多项式时间内被一台DTM所接受的语言}
NP={L|L是一个能在多项式时间内被一台NDTM所接受的语言}
由于一台确定性图灵机可看作是非确定性图灵机的特例,所以可在多项式时间内被确定性图灵机接受的语言也可在多项式时间内被非确定性图灵机接受。故PNP。
P、NP与NPC问题
P问题:可以在多项式时间内解决的问题。例如:排序。
NP问题:可以在多项式的时间里验证一个解的问题。分两步验证: (1) 非确定性的给出一个猜测解;(2)在多项式时间内验证。例如:验证旅行售货商问题中受否存在一个总长度不超过一个上限的路径。
NPC(NP Complete)问题: 是NP的一个子集,且其中每一个问题均能由NP中的任何问题在多项式时间内转化而成。
NP完全(NPC)问题
PP
直观上看,P类问题是确定性计算模型下的易解问题类,而NP类问题是非确定性计算模型下的易验证问题类。
解决问题(最短路径)往往比验证问题(验证是否存在一条小于上限的路径)难得多。大多数计算机科学家认为:NP类问题中包含了不属于P类的语言,即P≠NP。
数学上著名的NP问题,完整的叫法是NP完全问题,简单的写法是 **NP=P?**的问题。
NP完全问题的性质:如果一个NP完全问题能在多项式时间内得到解决,那么NP中的每一个问题都可以在多项式时间内求解,即P=NP。
目前还没有一个NPC问题有多项式时间算法。
NP完全问题的例子
- 哈密尔顿回路问题(所有路径顺次经历一圈)
- 旅行售货员问题(所有城市顺次经历一圈,圈最小)
NP完全问题的近似算法
迄今为止,所有的NP完全问题都还没有多项式时间算法。对于这类问题,通常可采取以下几种解题策略:
- 只对问题的特殊实例求解
- 用动态规划法或分支限界法求解
- 用概率算法求解
- 只求近似解
- 用启发式方法求解
原创声明
文章作者:Zam9036
文章链接:https://zam9036.gitee.io/2020/02/27/28-Algorithm-design-and-analysis-study-notes-1
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请保留文章链接并注明来自Zam9036的博客!