第一章算法的基本概念
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章算法的基本概念
1.1 引言
算法设计与分析在计算机科学与技术中的地位
算法(Algorithm)一词的由来。
1.1.1 算法的定义和特征
欧几里德算法:
算法1.1欧几里德算法
输入:正整数m,n
输出:m,n的最大公因子
1. int euclid(int m,int n)
2. {
3. int r;
4. do {
5. r = m % n;
6. m = n;
7. n = r;
8. } while(r)
9. return m;
10. }
一、算法的定义:
定义1.1算法是解某一特定问题的一组有穷规则的集合。
二、算法的特征:
1.有限性。算法在执行有限步之后必须终止。
2.确定性。算法的每一个步骤,都有精确的定义。要执行的每一个动作都是清晰的、无歧义的。
3.输入。一个算法有0个或多个输入,它是由外部提供的,作为算法开始执行前的初始值,或初始状态。算法的输入是从特定的对象集合中抽取的。
4.输出。一个算法有一个或多个输出,这些输出,和输入有特定的关系,实际上是输入的某种函数。不同取值的输入,产生不同结果的输出。
1
5.能行性。算法的能行性指的是算法中有待实现的运算,都是基本的运算。原则上可以由人们用纸和笔,在有限的时间里精确地完成。
1.1.2 算法设计的例子,穷举法
一、穷举法,是从有限集合中,逐一列举集合的所有元素,对每一个元素逐一判断和处理,从而找出问题的解。
二、例
例1.1百鸡问题。
“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”
a:公鸡只数,b:母鸡只数,c:小鸡只数。约束方程:
b
+c
a(1.1.1)
+
100
=
b
a(1.1.2)
+
+c
5=
100
3/
3
c(1.1.3)
%=
3
1。第一种解法:
a、b、c的可能取值范围:0 ~ 100,对在此范围内的,a、b、c的所有组合进行测试,凡是满足上述三个约束方程的组合,都是问题的解。
把问题转化为用n元钱买n只鸡,n为任意正整数,则方程(1.1.1)、(1.1.2)变成:+(1.1.4)
n
a=
+
c
b
3
+3/
5(1.1.5)
+
c
n
b
a=
算法1.2百鸡问题
输入:所购买的三种鸡的总数目n
输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n,int &k,int g[],int m[],int s[])
2. {
3. int a,b,c;
4. k = 0;
5. for (a=0;a<=n;a++)
6. for (b=0;b<=n;b++)
7. for (c=0;c<=n;c++) {
8. if ((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)) {
9. g[k] = a;
10. m[k] = b;
11. s[k] = c;
12. k++;
13. }
2
14. }
15. }
16. }
17. }
执行时间:外循环:1
n次,
+
中间循环:)1
+n
⨯
n次,
)1
(+
(
内循环:)1
⨯
+n
n次。
+
n
)1
)1
(
(
⨯
(+
当100
n时,内循环的循环体执行次数大于100万次。
=
2。第二种解法:
公鸡只数:~
05/n
母鸡只数:~
03/n
母鸡只数:b
-
=。
n
c-
a
算法1.3改进的百鸡问题
输入:所购买的三种鸡的总数目n
输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_problem(int n,int &k,int g[],int m[],int s[])
2. {
3. int i,j,a,b,c;
4. k = 0;
5. i = n / 5;
6. j = n / 3;
7. for (a=0;a<=i;a++)
8. for (b=0;b<=j;b++) {
9. c = n – a – b;
10. if ((5*a+3*b+c/3==n)&&(c%3==0)) {
11. g[k] = a;
12. m[k] = b;
13. s[k] = c;
14. k++;
15. }
16. }
17. }
18. }
执行时间:外循环:1
n
5/+
内循环:)1
⨯
+n
n
3/
(+
(
)1
5/
3