[计算机算法设计与分析] 算法概述
学习要点:
- 理解算法的概念
- 理解什么是程序,程序与算法的区别和内在联系
- 掌握算法的计算复杂性概念
- 掌握算法渐进复杂性的数学表述
- 掌握用C++语言描述算法的方法
1.1 算法
算法是指解决问题的一种方法或一个过程。算法是若干指令的又穷序列,满足性质:
- 输入:由外部提供的量作为算法的输入。
- 输出:算法至少产生一个量作为输出。
- 确定性:组成算法的每条指令是清晰,无歧义的。
- 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
程序:
程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质4.
例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。
程序和算法的区别:
算法是解决问题的步骤;程序是算法的代码实现,算法要依靠程序来完成功能;程序需要算法作为灵魂。
程序是结果,算法是手段(为编写出好程序所使用的运算方法)。同样编写一个功能的程序,使用不同的算法可以让程序的体积、效率差很多。所以算法是编程的精华所在
算法+数据结构=应用程序。算法是程序设计的核心,算法的好坏很大程度上决定了一个程序的效率。一个好的算法可以降低程序运行的时间复杂度和空间复杂度。先选出一个好的算法,再配合以一种适宜的数据结构,这样程序的效率会大大提高。
好的算法 |
提高求解问题的效率 节省存储空间 |
---|---|
需要解决的问题 | 问题——>寻找求解算法 算法设计技术
算法——>算法的评价 算法分析技术 算法类——>问题复杂度的评价 问题复杂性分析 问题类——>能够求解的边界 计算复杂性理论 |
1.2 算法复杂性分析
算法复杂性=算法所需要的计算机资源:时间资源和空间资源
算法的时间复杂性T(n);
算法的空间复杂性:S(n)。
其中n就是问题的规模。
算法的时间复杂性
最好情况下的时间复杂性:Tmax(n)=max{T(I)|size(I)=n}
最坏情况下的时间复杂性:Tmin(n)=min{T(I)|size(I)=n}
平均情况下的时间复杂性:Tavg(n)=
其中I是问题的规模n的实例,P(I)是实例I出现的概率。
算法的渐进复杂性
T(n) 倾向于无穷 , as n倾向于无穷 ;
(T(n) - t(n) )/ T(n) ->0 ,as n倾向于无穷;
t(n)是T(n)的渐近性态,为算法的渐近复杂性。
n在数学上, t(n)是T(n)的渐近表达式,是T(n)略去低阶项留下的主项,比T(n) 简单。
1.3NP完全性理论
NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。
P类问题:所有可以在多项式时间内求解的判定问题构成P类问题。
判定问题:判断是否有一种能够解决某一类问题的能行算法的研究课题。
NP类问题:所有的非确定性多项式时间可解的判定问题构成NP类问题。
非确定性算法:非确定性算法将问题分解成猜测和验证两个阶段。算法的猜测阶段是非常确定性的,算法的验证阶段是确定性的,它验证猜测阶段给出解的正确性。
NPC问题:NP中的某些问题的复杂性与整个类的复杂性相关联。这些问题中任何一个如果存在多项式时间的算法,那么所有NP问题都是多项式时间可解的。这些问题被称为NP-完全问题(NPC问题)。
邻近法 |
推销员从某个城镇出发,永远选择前往最近且尚未去过的城镇,最后再返回原先的出发点。这方法简单,也许是多数人的直觉做法,但是近邻法的短视使其表现非常不好,通常后段的路程会非常痛苦。 |
插入法 | 先产生连接部分点的子路线,再根据某种法则将其它的点逐一加入路线。比如最近插入法(nearest insertion),先针对外围的点建构子路线,然后从剩余的点里面评估何者加入后路线总长度增加的幅度最小,再将这个点加入路线。又比如最远插入法(farthest insertion),是从剩余的点里面选择距离子路线最远的点,有点先苦后甜的滋味。 |
模拟退火算法 |
n来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解。 |
演化算法 |
n遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。生物种群的生存过程普遍遵循达尔文进化准则,群体中的个体根据对环境的适应能力而被大自然所选择或淘汰。进化过程的结果反映在个体的结构上,其染色体包含若干基因,相应的表现型和基因型的联系体现了个体的外部特性与内部机理间逻辑关系。通过个体之间的交叉、变异来适应大自然环境。生物染色体用数学方式或计算机方式来体现就是一串数码,仍叫染色体,有时也叫个体;适应能力是对应着一个染色体的一个数值来衡量;染色体的选择或淘汰则按所面对的问题是求最大还是最小来进行。 |
神经网络算法 | 根据一个简化的统计,人脑由百亿条神经组成 — 每条神经平均连结到其它几千条神经。通过这种连结方式,神经可以收发不同数量的能量。神经的一个非常重要的功能是它们对能量的接受并不是立即作出响应,而是将它们累加起来,当这个累加的总和达到某个临界阈值时,它们将它们自己的那部分能量发送给其它的神经。大脑通过调节这些连结的数目和强度进行学习。尽管这是个生物行为的简化描述。但同样可以充分有力地被看作是神经网络的模型。 |
1.4 算法分析的基本原则
递归算法复杂性分析
最优算法:
n问题的计算时间下界为W(f(n)),则计算时间复杂性为O(f(n))的算法是最优算法。
n例如,排序问题的计算时间下界为W(nlogn),计算时间复杂性为O(nlogn)的排序算法是最优算法。
n堆排序算法是最优算法。