赞
踩
算法
是指解决问题的一种方法
或一个过程
。
算法是对特定问题求解步骤
的一种描述,是若干指令的有穷序列。
输入
:有外部提供的量作为算法的输入输出
:算法产生至少一个量
作为输出确定性
:组成算法的每条指令是清晰、无歧义的。相同的输入只能有唯一的输出结果;算法在一定条件下,只有一条执行路径;有限性
:算法中每条指令的执行次数是有限的,每条指令的执行时间也是有限的
程序是算法用某种程序设计语言的具体实现
程序可以不满足算法的性质:有限性。
例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序,通过特定的算法来实现。该子程序得到输出结果后便终止。
算法复杂性分析分为时间复杂性分析
和空间复杂性分析
算法的时间复杂性
T(N, I)表示所需的时间资源的量,其中N是问题的规模, I 是算法的输入。
算法的空间复杂性
S(N, I)表示所需的空间资源的量
主要讨论时间复杂性
, 空间复杂性分析相对比较简单, 计量方法相似。
根据T(N, I)的概念, T(N, I)是算法在计算机上执行所需要的时间。
T(N, I): 基本元运算的计算时间
定义计算机元运算:
O
1
O_1
O1,
O
2
O_2
O2, … ,
O
k
O_k
Ok,执行一次运算所需要的时间为
t
1
t_1
t1,
t
2
t_2
t2, …,
t
k
t_k
tk。对于给定一算法A,用到元运算
O
i
O_i
Oi的次数为
e
i
e_i
ei,对于每一个i,1 ≤ i ≤ k,
e
i
e_i
ei是N和I的函数,
e
i
e_i
ei=
e
i
e_i
ei(N, I),定义:
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间
和存储本身所使用的指令、常数、变量和输入数据外
,还需要一些对数据进行操作的工作单元
和存储一些为现实计算所需信息的辅助空间
。程序执行时所需存储空间
包括以下两部分。
固定部分
。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。可变空间
,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等
。这部分的空间大小与算法有关
。一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。先举个栗子:
T(N) 3N2+4NlogN+7
T’(N) N2
T'(N)是T(N)当N -> ∞时的渐进表达式,或渐近性态;
T'(N)是算法当N -> ∞的渐近复杂性。
函数T(N)的阶
: 随着规模N的增大, T(N)增长速度的快慢
举个栗子:T(N)=4NlogN+7 T’(N)=N2,
随着规模N的增大, T‘(N)的增长速度比T(N)的增长速度快, 此时,T’(N)的阶高于T(N),或相对于T(N), T’(N)=是高阶项
渐进复杂性
:对于T(N),如果存在函数T’(N),使得当N→∞使有如下公式成立,则T’(N)是T(N)当N→∞时的渐进复杂性。
在数学上,T‘(N)
是T(N)当N→ ∞时的渐进表达式
,是T(n)略去低阶项留下的主项,比T(n) 简单。
分析算法复杂性:只要得到不同T'(N)的阶即可。
O(g(N)) = { f(N) | 存在正常数C和N0,使得对所有N ≥ N0有:0 ≤ f(N) ≤ Cg(N) } , 记为 f(N) =O(g(N)) ,则称f(N)的阶不高于g(N)的阶 as N -> ∞。
渐进上界符号O(g(N)) :保存了所有以g(N)为上界的正函数的集合,或者不高于g(N)的阶的正函数组成的集合。该上界的阶越低越好
。
实际上:f(N) =O(g(N)) 表示f(N) ∈ O(g(N))
当N ≥ 1时,有N+1024 ≤ 1025N, 所以有N+1024=O(N)
当N ≥ 10时,有2N2 +11N-10 ≤ 3N2, 所以2N2 +11N-10=O(N2)
当N ≥ 1时,有N2 ≤ N3 ,所以有N2 = O(N3 )
Ω (g(N)) = { f(N) | 存在正常数c和n0使得对所有N ≥ N0有:0 ≤ cg(N) ≤ f(N) }, 记为 f(N) =Ω(g(N)) ,或说f(N)的阶不低于g(N)的阶
1 as N -> ∞。
渐进下界符号Ω(g(N)) :保存了以g(N)为下界的正函数的集合。该渐进下界的阶越高,则评估就越准确,结果就越有价值。
f(N) = Ω (g(N)) 表示f(N) ∈ Ω(g(N))
f(N)=θ(g(N))当且仅当f(N)=O(g(N))且f(N)=Ω(g(N))。此时称f(N)与g(N)同阶
:f(N) = θ(g(N)) 表示f(N) ∈ θ(g(N))
o(g(N)) = {f(N) | 对于任何正常数
ε
\varepsilon
ε>0,存在正数n0 >0使得对所有n ≥
n
0
n_0
n0有:0 ≤ f(N)/ g(N) <
ε
\varepsilon
ε}, 记为 f(N) =o (g(N)) ,则称f(N)的阶比g(N)低
as n -> ∞ 。
f(N) =o (g(N)) 实际上表示f(N) o (g(N))
例:4NlogN+7=o(3N2+4NlogN+7)。
不能直接用于计算机
。伪代码使用一种介于自然语言和计算机语言之间的文字和符号来描述算法的方法。如何判断一个问题是“易”计算的,还是“难”计算的
?多项式时间
算法求解的问题看作是易解问题,而需要超多项式时间算法
才能求解的问题看作是难解
问题(如:复杂度函数为指数函数,阶乘函数等)。最优化问题
1. 寻找一个有最优目标函数值的可行解
2. 许多最优化问题是难解问题
判定问题
1. 输出仅为“是”或“否”的一类问题
2 可抽象为所有输入到{yes, no}的映射
优化问题例子(旅行售货员问题
)
某售货员到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条路线,经过每个城市一遍最后回到驻地的路线,使得总的路程(或总旅费)最小
。
判定问题例子(旅行售货员问题
)
某售货员到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要经过每个城市一遍后回到驻地,要求判定图G中是否存在总费用不超过d的周游路线
。
判定问题比最优化问题容易求解
最优化问题可简化为判定问题
若判定问题是难解问题,则更为复杂的优化问题也定是难解问题
可通过分析判定问题的难易,来判断优化问题的难易
Polynomial:多项的,多词的;多项式的 /,pɑlɪ’nomɪəl/ (先来学个单词
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。