基本的算法策略(1).ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题分析: 1)先看一简单问题:有一位探险家用5天的时间徒步 横穿A、B两村,两村间是荒无人烟的沙漠,如果一 个人只能担负3天的食物和水,那么这个探险家至 少雇几个人才能顺利通过沙漠。
{print(“data error”);
return;}
else
{ c = a mod b;
while c<>0
{ a=b;
b=c;
c=a mod b;}
}
print(b);
}
百度文库专用
8
4.1.2 倒推法
所谓倒推法:是对某些特殊问题所采用的违反通常习惯的, 从 后向前推解问题的方法。如下面的例题,因不同方面的需求 而采用了倒推策略。
for (i=3;i<=n;i=i+1)
{a[1]=a[i]=1; for (j=i-1,j>1,j=j-1)
a[j]=a[j]+a[j-1];
for (j=1;j<=i;j=j+1) print(a[j]); print(“换行符”);
}
}
百度文库专用
12
【例3】穿越沙漠问题
用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为 500加仑,耗油率为1加仑/公里。由于沙漠中没有油库, 必须先用这辆车在沙漠中建立临时油库。该吉普车以最少 的耗油量穿越沙漠,应在什么地方建油库,以及各处的贮 油量。
算法设计:循环“不变式”第一次是求a、b相除的余数c,第二 次还是求“a”“b” 相除的余数,经a=b,b=c操作,就实现了第二 次还是求“a”“b” 相除的余数,这就找到了循环不变式。循环在 余数c为0时结束。
百度文库专用
7
算法如下:
main()
{ int a, b;
input(a,b);
if(b=0)
例1在不知前提条件的情况下,经过从后向前递推,从而求解问 题。即由结果倒过来推解它的前提条件。又如例2由于存储的要 求,而必须从后向前进行推算。另外,在对一些问题进行分析或 建立数学模型时,从前向后分析问题感到比较棘手,而采用倒推 法(如例3),则问题容易理解和解决。下面分别看这几个例子:
百度文库专用
算法2,最后输出的 并不是12项,而是 2+3*4共14项。
{ c=a+b; a=b+c; b=c+a; pri源自文库t(a,b,c); }
}
百度文库专用
5
算法3:
表4-2 递推迭代表达式
12
3
4
56
7 89
a b a=a+b b=a+b a=a+b b=a+b ……
由此归纳出可以用“a=a+b; b=a+b;”做循环“不变式”, 从而得到以下算法3:
main( )
{ int i,a=1,b=1;
print(a,b);
for(i=1; i<=5;i++)
{ a=a+b;
b=a+b;
print(a,b); }
}
百度文库专用
6
【例2】求两个整数的最大公约数。
数学建模:辗转相除法是根据递推策略设计的。
不妨设两个整数a>b且a除以b商x余c;则a-bx=c,不难看出a、b 的最大公约数也是c的约数(一个数能整除等式左边就一定能整 除等式的右边),则a、b的最大公约数与b、c的最大公约数相同。 同样方法推出b、c的最大公约数与……,直到余数为0时,除数即 为所求的最大公约数。
第四章 基本的算法策略
4.1 迭代算法 4.2 蛮力算法 4.3 分而治之算法 4.4 贪婪算法 4.5 动态规划 4.6 算法策略间的比较
百度文库专用
1
4.1 迭代算法
4.1.1 递推法 4.1.2 倒推法 4.1.3 迭代法解方程
百度文库专用
2
4.1.1 递推法
【例1】兔子繁殖问题 问题描述:一对兔子从出生后第三个月开始,每月生一对小兔
9
【例1】猴子吃桃问题 一只小猴子摘了若干桃子,每天吃现有桃的一半多一个, 到第10天时就只有一个桃子了,求原有多少个桃? 数 学 模 型 : 每 天 的 桃 子 数 为 : a10=1, a9=(1+a10)*2, a8=(1+a9)*2,……a10=1, 递推公式为:ai=(1+ai+1)*2 I = 9,8,7,6……1 算法如下 :
} }
百度文库专用
4
算法2:
表4-1 递推迭代表达式
12 3
4
56
7
89
a b c=a+b a=b+c b=a+c c=a+b a=b+c b=a+c ……
由此归纳出可以用“c=a+b; a=b+c; b=c+a;”做循环“不变 式”。
算法2如下:
main( )
{ int i,a=1,b=1; print(a,b); for(i=1; i<=4;i++)
问题分析:题目中要求用一个一维数组即
14 6 ……………
4
1
完成。数组空间一定是由下标从小到大 图4-1 杨辉三角形
利用的,这样其实杨辉三角形是按下图
4-2形式存储的。若求n层,则数组最多
存储n个数据。
算法设计:
A[1] = A[i]=1 A[j] = A[j] + A[j-1] i行 i-1行 i-1行
1 1 1+1=2 2+1=3 3+2=5 5+3=8 ……
百度文库专用
3
数学建模:y1=y2=1,yn=yn-1+yn-2,n=3,4,5,……。
算法1:
main( ) { int i,a=1,b=1;
print(a,b); for(i=1;i<=10;i++)
{ c=a+b; print (c); a=b; b=c;
j=i-1,i-2,……,2
百度文库专用
1 11 121 1331 14641 ……………
图4-2 杨辉三角形存储格式
11
算法如下:
main( )
{int n,i,j,a[100];
input(n); print(“1”); print(“换行符”);
a[1]=a[2]=1; print(a[1],a[2]); print(“换行符”);
main( ) { int i,s; s=1; for (i=9 ;i>=1;i=i-1) s=(s+1)*2 print (s);
}
百度文库专用
10
【例2】 输出如图4-1的杨辉三角形(限 定用一个一维数组完成)。
数学模型:上下层规律较明显,中间的数
1 11 121
等于上行左上、右上两数之和。
13 3 1
子。小兔子到第三个月又开始生下一代小兔子。假若兔子 只生不死,一月份抱来一对刚出生的小兔子,问一年中每 个月各有多少只兔子。
问题分析:因一对兔子从出生后第三个月开始每月生一对小兔 子,则每月新下小兔子的对儿数(用斜体数字表示)显然由前 两个月的小兔子的对儿数决定。则繁殖过程如下:
一月 二月 三月 四月 五月 六月 ……
{print(“data error”);
return;}
else
{ c = a mod b;
while c<>0
{ a=b;
b=c;
c=a mod b;}
}
print(b);
}
百度文库专用
8
4.1.2 倒推法
所谓倒推法:是对某些特殊问题所采用的违反通常习惯的, 从 后向前推解问题的方法。如下面的例题,因不同方面的需求 而采用了倒推策略。
for (i=3;i<=n;i=i+1)
{a[1]=a[i]=1; for (j=i-1,j>1,j=j-1)
a[j]=a[j]+a[j-1];
for (j=1;j<=i;j=j+1) print(a[j]); print(“换行符”);
}
}
百度文库专用
12
【例3】穿越沙漠问题
用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为 500加仑,耗油率为1加仑/公里。由于沙漠中没有油库, 必须先用这辆车在沙漠中建立临时油库。该吉普车以最少 的耗油量穿越沙漠,应在什么地方建油库,以及各处的贮 油量。
算法设计:循环“不变式”第一次是求a、b相除的余数c,第二 次还是求“a”“b” 相除的余数,经a=b,b=c操作,就实现了第二 次还是求“a”“b” 相除的余数,这就找到了循环不变式。循环在 余数c为0时结束。
百度文库专用
7
算法如下:
main()
{ int a, b;
input(a,b);
if(b=0)
例1在不知前提条件的情况下,经过从后向前递推,从而求解问 题。即由结果倒过来推解它的前提条件。又如例2由于存储的要 求,而必须从后向前进行推算。另外,在对一些问题进行分析或 建立数学模型时,从前向后分析问题感到比较棘手,而采用倒推 法(如例3),则问题容易理解和解决。下面分别看这几个例子:
百度文库专用
算法2,最后输出的 并不是12项,而是 2+3*4共14项。
{ c=a+b; a=b+c; b=c+a; pri源自文库t(a,b,c); }
}
百度文库专用
5
算法3:
表4-2 递推迭代表达式
12
3
4
56
7 89
a b a=a+b b=a+b a=a+b b=a+b ……
由此归纳出可以用“a=a+b; b=a+b;”做循环“不变式”, 从而得到以下算法3:
main( )
{ int i,a=1,b=1;
print(a,b);
for(i=1; i<=5;i++)
{ a=a+b;
b=a+b;
print(a,b); }
}
百度文库专用
6
【例2】求两个整数的最大公约数。
数学建模:辗转相除法是根据递推策略设计的。
不妨设两个整数a>b且a除以b商x余c;则a-bx=c,不难看出a、b 的最大公约数也是c的约数(一个数能整除等式左边就一定能整 除等式的右边),则a、b的最大公约数与b、c的最大公约数相同。 同样方法推出b、c的最大公约数与……,直到余数为0时,除数即 为所求的最大公约数。
第四章 基本的算法策略
4.1 迭代算法 4.2 蛮力算法 4.3 分而治之算法 4.4 贪婪算法 4.5 动态规划 4.6 算法策略间的比较
百度文库专用
1
4.1 迭代算法
4.1.1 递推法 4.1.2 倒推法 4.1.3 迭代法解方程
百度文库专用
2
4.1.1 递推法
【例1】兔子繁殖问题 问题描述:一对兔子从出生后第三个月开始,每月生一对小兔
9
【例1】猴子吃桃问题 一只小猴子摘了若干桃子,每天吃现有桃的一半多一个, 到第10天时就只有一个桃子了,求原有多少个桃? 数 学 模 型 : 每 天 的 桃 子 数 为 : a10=1, a9=(1+a10)*2, a8=(1+a9)*2,……a10=1, 递推公式为:ai=(1+ai+1)*2 I = 9,8,7,6……1 算法如下 :
} }
百度文库专用
4
算法2:
表4-1 递推迭代表达式
12 3
4
56
7
89
a b c=a+b a=b+c b=a+c c=a+b a=b+c b=a+c ……
由此归纳出可以用“c=a+b; a=b+c; b=c+a;”做循环“不变 式”。
算法2如下:
main( )
{ int i,a=1,b=1; print(a,b); for(i=1; i<=4;i++)
问题分析:题目中要求用一个一维数组即
14 6 ……………
4
1
完成。数组空间一定是由下标从小到大 图4-1 杨辉三角形
利用的,这样其实杨辉三角形是按下图
4-2形式存储的。若求n层,则数组最多
存储n个数据。
算法设计:
A[1] = A[i]=1 A[j] = A[j] + A[j-1] i行 i-1行 i-1行
1 1 1+1=2 2+1=3 3+2=5 5+3=8 ……
百度文库专用
3
数学建模:y1=y2=1,yn=yn-1+yn-2,n=3,4,5,……。
算法1:
main( ) { int i,a=1,b=1;
print(a,b); for(i=1;i<=10;i++)
{ c=a+b; print (c); a=b; b=c;
j=i-1,i-2,……,2
百度文库专用
1 11 121 1331 14641 ……………
图4-2 杨辉三角形存储格式
11
算法如下:
main( )
{int n,i,j,a[100];
input(n); print(“1”); print(“换行符”);
a[1]=a[2]=1; print(a[1],a[2]); print(“换行符”);
main( ) { int i,s; s=1; for (i=9 ;i>=1;i=i-1) s=(s+1)*2 print (s);
}
百度文库专用
10
【例2】 输出如图4-1的杨辉三角形(限 定用一个一维数组完成)。
数学模型:上下层规律较明显,中间的数
1 11 121
等于上行左上、右上两数之和。
13 3 1
子。小兔子到第三个月又开始生下一代小兔子。假若兔子 只生不死,一月份抱来一对刚出生的小兔子,问一年中每 个月各有多少只兔子。
问题分析:因一对兔子从出生后第三个月开始每月生一对小兔 子,则每月新下小兔子的对儿数(用斜体数字表示)显然由前 两个月的小兔子的对儿数决定。则繁殖过程如下:
一月 二月 三月 四月 五月 六月 ……