算法分析与设计:绪论

● 算法与程序

算法是指解决问题的一种方法或一个过程
算法是若干指令的有穷序列,满足性质:
(1) 输入:有外部提供的量作为算法的输入。
(2) 输出:算法产生至少一个量作为输出。
(3) 确定性:组成算法的每条指令是清晰无歧义的。
(4) 有限性:算法中每条指令的执行次数有限的,执行每条指令的时间也是有限的。

程序算法用某种程序设计语言的具体实现程序可以不满足算法的性质,例如操作系统

● 设计算法的步骤

理解问题:在设计一个算法前,我们需要做的第一件事就是完全理解所给出的问题。同时,严格确定算法需要处理的实例范围是非常重要的。一个正确的算法不仅应该能处理大多数的情况,而且应该能正确处理所有合法的输入。
了解计算机设备的性能:今天使用的大多数算法仍然要运行于冯·诺依曼计算机上。它最主要的随机存取机设想是:指令逐条运行,每次执行一步操作,称为顺序算法。一些更新式的计算机可以在同一时间执行多条操作,即并行计算
在精确和近似间做选择:精确的解法称为精确算法,近似的解法称为近似算法。无法求得精确解或由于某些问题固有的复杂性,用已知的精确算法来解决该问题可能会慢得无法接受。
确定适当的数据结构算法数据结构是计算机编程重要基础程序=算法+数据结构

● 分析算法的指标

对于一个任何一个算法或解决方案,有下面的两个问题:
(1) 问题能解决吗?
(2) 问题解决的好吗?

效率分析并不是算法分析的唯一目的。虽然算法追求的目标是速度,但算法必须首先正确才有存在的意义。设计算法时,或者对多个算法进行比较时,就要分析它们的正确性时间效率。这种对算法进行解剖而获得其正确性和时间效率的操作就是算法分析。如果两个算法的时间效率一样,我们就要对算法实现所使用的空间进行比较,空间使用较少的为优。
因此,算法分析可以分为如下3个方面:
(1) 正确性分析
(2) 时空效率分析
(3) 时空特性分析

算法复杂性 = 算法所需要的计算机资源
算法的时间复杂性T(n)算法的空间复杂性S(n)
其中n问题的规模(输入大小)。

算法的时间复杂性有如下分析方法:
(1)最坏情况下的时间复杂性
Tmax(n) = max{ T(I) | size(I)=n }
(2)最好情况下的时间复杂性
Tmin(n) = min{ T(I) | size(I)=n }
(3)平均情况下的时间复杂性
Tavg(n) =在这里插入图片描述
其中I是问题的规模为n的实例,p(I)是实 例I出现的概率

若对 T(n) →∞ , as n→∞ ;
有(T(n) - t(n) )/ T(n) →0 ,as n→∞;
则称t(n)是T(n)的渐近性态,为算法的渐近复杂性
在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶项留下的主项。它比T(n) 简单。

渐近分析的记号:在下面的讨论中,对所有n,f(n) ≥ 0,g(n) ≥ 0。
(1) 渐近上界记号O
O(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥ n0有:0 ≤ f(n) ≤ cg(n) }
(2) 渐近下界记号Ω
Ω(g(n)) = { f(n) | 存在正常数c和n0使得对所有n≥ n0有:0 ≤ cg(n) ≤ f(n) }
(3) 非紧上界记号o
o(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n≥ n0有:0 ≤ f(n) < cg(n) }
等价于 f(n) / g(n) →0 ,as n→∞。
(4) 非紧下界记号ω
ω(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n ≥ n0有:0 ≤ cg(n) < f(n) }
等价于 f(n) / g(n) →∞ ,as n→∞。
f(n) ∈ ω (g(n)) 等价于 g(n) ∈ o (f(n))
(5) 紧渐近界记号Θ
Θ(g(n)) = { f(n) | 存在正常数c1,c2和n0使得对所有n ≥ n0有:c1g(n) ≤ f(n) ≤ c2g(n) }

对于算法的时间函数f(n),如果f(n)g(n)同一数量级的(同阶),可用f(n)=O(g(n))的形式来表示。称上式为算法的时间复杂度,或称该算法的时间复杂度为O(g(n))
一般常用的时间复杂度有如下的关系:
O(1) ≤O (log2n) ≤O (n) ≤O (n*log2n) ≤O (n2) ≤O (n3) ≤ … ≤O (nk) ≤O (2n)<O(n!)

● 算法的分类

算法大致分为以下三类:
(1) 有限的、确定性算法
这类算法在有限的一段时间内终止。它们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值
(2) 有限的、非确定算法
这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的
(3) 无限的算法
指那些由于没有定义终止条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定地定义终止条件。

经典算法
1.穷举搜索法
2.迭代算法
3.递推算法
4.递归算法
5.分治算法
6.贪心算法
7.动态规划算法
8.回溯算法
9.分支限界算法

发布了39 篇原创文章 · 获赞 4 · 访问量 2052

猜你喜欢

转载自blog.csdn.net/weixin_44712386/article/details/105008543