当前位置:文档之家› 计算机算法概论

计算机算法概论

系。 掌握算法的计算复杂性概念。 掌握算法渐近复杂性的数学表述。 掌握用C/C++语言描述算法的方法。
一、什么是算法?
20世纪50年代,西方著名的词典中还未 曾收录过算法(Algorithm)一词,据西方数 学史家考证, Algorithm取自于古代阿拉 伯学者的名著《复原和化简的规则》一书 的作者的署名中的al-Khwarizmi,而从作 品名字中的al-jabr派生出了Algebra(代数) 一词。
• 这样,算法1.1中可以改为:
• void chicken_problem(int n,int &k,int g[],int m[],int s[])
•{
• int i,j,a,b,c;
• k=0;
• i=n/5;
• j=n/3;
• for(a=0;a<=i;a++){

for(b=0;b<=j;b++){
算法设计与分析课程介绍
课程内容 1.算法概述
2. 算法设计
1)穷举法 2)分治法及递归算法分析 3)图的算法 4) 贪心法 5) 动态规划法
6) 回溯法 7) 分支-限界法 8) NP—完全性
9)概率算法 10)近似算法
第一讲 算法概述 学习要点:
理解算法的概念。 理解什么是程序,程序与算法的区别和内在联
(9) 布尔可满足性问题: 文字:x1 x1 x2 x3 x3 x4
子句:( x1 x2 ) (x1 x2 x4 ) ( x1 x3 ) 合取范式形式的布尔公式:
F = ( x1 x2 ) (x1 x2 x4 ) ( x1 x3 )
若存在对变元的一组赋值,使得F取真值,则 称F为可满足的。
问题求解(Problem Solving)
理解问题 精确解或近似解
选择数据结构 算法设计策略
设计算法 证明正确性
分析算法 设计程序
五、算法设计的例子—穷举法
例1.1 百鸡问题 公元5世纪末,数学家张丘建在《算
经》中,提出这样一个问题:“鸡翁一, 值钱五;鸡母一,值钱一;鸡雏三,值 钱一。百钱买百鸡,问鸡翁、母、雏各 几何”。
如果对任意数目的n个城市,分别用1-n的数 字编号,这个问题归结为带权有向图中,寻 找一条路径最短 的哈密尔顿回路问题。
思考:存储的实现方法
售货员的每一条路线,对应于城市编号 1,2,…, n的一个排列。用一个数组来存放 这个排列中的数据,数组中的元素依次 存放旅行路线中的城市编号。
n个城市具有n!个排列,售货员共有n!条 路线可供选择。采用穷举法逐一计算每 一条路线的费用,从中找出费用最小的 路线,便可求出问题的解。

for(c=0;c<=n;c++){
if((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)){

g[k]=a;

m[k]=b;

s[k]=c;

k++;

}
•ห้องสมุดไป่ตู้
}

}
•}
•}
• 当n=100时,内循环体执行次数大于100 万次
• 考虑到n元钱只可以买到n/5只公鸡,或 n/3只母鸡,有些组合可以不必考虑。而 小鸡的只数又与公鸡及母鸡的只数相关, 内循环可以省去。
以下六种计算时间的多项式时间算法是最为常见 的,其关系为:
O(1)<O(longn) <O(n) <O(nlongn) <O(n2) <O(n3)
指数时间算法一般有以下几种,它们关系为: O(2n) <O(n!) <O(nn)
因此,只要有人能将现在指数时间算法中 的任何一个算法化简为多项式时间算法, 那就取得了一个伟大的成就!
(3) 旅行商问题:给定整数n2, nn距离矩阵dij , 以及整数B 0。判定:是否存在{1, 2, …, n}的 一个排列 ,使得C( ) B。
(4) 独立集问题:给定无向图G和整数k2。判定: 图G是否存在顶点集V的子集C满足|C| K,并使 得对所有vi,vjC, 在vi和 vj之间没有边。
算法1.3 穷举法版本的货郎担问题
输入:城市个数n,费用矩阵c[][]
输出:旅行路线t[],最小费用min
• void salesman_problem(int n,float &min,int t[],float c[][])
•{
• int p[n],i=1;
• float cost;
• min=MAx_FLoat_NUM;
令a为公鸡只数,b为母鸡只数,c为小鸡只数
a+b+c=100
(1)
5a+3b+c/3=100 (2)
c%3=0
(3)
上述百鸡问题中,a、b、c的可能取值范围为 0-100,对在此范围内的a、b、c的所有组合进 行测试,凡是满足上述3个约束方程的组合, 都是问题的解。
• 输入:所购买的3种鸡的总数目n
(10) 二元可满足性问题: 二元合取范式形式的布尔公式: 所有子句最多 有两个文字的合取范式形式的布尔公式。
(11) 0/1背包问题
给定n 种物品和一个可容纳M重量的背包,以 及正数K。已知每一种物品i 的重量为wi , 如果把 物品i 放入背包,就会得到pi的效益( wi,pi>0; i = 1,2,…,n)。判定:是否存在一种装包方法,使装 入背包物品的总效益大于K?
(7) 整数划分问题:给定用二进制表示的n个非负整 数a1, a2, …, an的集合。判定:是否存在子集P
{ 1, 2, …, n }, 使得iP ai = iP ai ?
(8) 一进制整数划分问题:给定用一进制表示的n个 非负整数a1, a2, …, an的集合。判定:是否存在
子集P { 1, 2, …, n }, 使得iP ai = iP ai ?
(5) Clique问题:给定无向图G和整数k2。判定: 图G是否存在顶点集V的子集C满足|C| K,并使 得对所有vi,vjC, 在vi和 vj之间有边。
(6) 顶点覆盖问题:给定无向图G和整数B 2。判 定:图G是否存在顶点集V的子集C满足|C| B, 使得C覆盖G的所有边。
(“覆盖”:若一个顶点集V至少包含某条边 的一个端点,则称顶点集V覆盖边e。)
• 输出:满足问题的解的数目k,公鸡,母 鸡,小鸡的只数g[],m[],s[]
• void chicken_question(int n,int &k,int g[],int m[],int s[])
•{
• int a,b,c;
• k=0;
• for(a=0;a<=n;a++){

for(b=0;b<=n;b++){
• while(i<=n!){

产生n个城市的第i个排列于p;

cost=路线p的费用;

if(cost<min){

把数组p的内容复制到数组t;

min=cost;

}

i++;
•}
•}
六、 若干问题
(1) Euler回路:给定有向图G。判定:G中是否存 在经过每一条边恰好一次的回路?
(2) Hamilton回路:给定有向图G。判定:G中是否 存在经过每一条顶点恰好一次的回路?
• Tavg(n) = p(I)T(I) siz(eI)n
• 其中I是问题的规模为n的实例,p(I)是实 例I出现的 概率。
算法时间的渐近表示
假设某算法的计算时间是f(n),其中变量n 可以是输入或输出量,也可以是两者之和,还 可以是它们之一的某种测度(例如,数组的维数, 图的边数等)。g(n)是在事前分析中确定的某个 形式很简单的函数,它是独立于机器和语言的 函数,而f(n)则与机器和语言有关。
• 选取c= |am|+…+|a0|,定理立即得证。
事实上,只要将n0取得足够大,可以证明只要 c是比|am|大的任意一个常数,此定理都成立。
这个定理表明,变量n的固定阶数为m的任一 多项式,与此多项式的最高阶nm同阶。因此 计算时间为m阶的多项式的算法,其时间都 可用O(nm)来表示。
• 从计算时间上可以把算法分成两类, 凡可用 多项式来对其计算时间限界的算法,称为多 项式时间算法(polynomial time algorithm); 而计算时间用指数函数限界的算法称为指数 时间算法(exponential time algorithm)。
题由操作系统中的一个子程序通过特定的算法来实现。 该子程序得到输出结果后便终止。
四、算法复杂性分析
• 算法复杂性 = 算法所需要的计算机资源 • 算法的时间复杂性T(n); • 算法的空间复杂性S(n)。 • 其中n是问题的规模(输入大小)。
算法的时间复杂性
• (1)最坏情况下的时间复杂性 • Tmax(n) = max{ T(I) | size(I)=n } • (2)最好情况下的时间复杂性 • Tmin(n) = min{ T(I) | size(I)=n } • (3)平均情况下的时间复杂性
随着时间的推移, Algorithm这个词的 含义,已经完全不同于它原来的含义了。
算法定义: 一个算法是一个有穷规则的集合。这些规则规
定了解决某一问题的一个运算序列。同时,一个 算法应该具有五个特性:有穷性、可行性、确定 性、输入、输出。
1. 有穷性:规则的有限性。或者说,求解问题的 运算序列,必须在有限的计算步后停止。
相关主题