第4章 计算机算法基础

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章 算法基础
4.1 算法的基本概念 4.2 算法的三种结构
4.3 算法的表示
4.4 算法设计基本方法 4.5 算法的评价
4.1.1 算法的起源
最早 《周髀算经》
源自文库
《九章算术》 四则运算、最大公约数、最小公倍数、开 平方根、开立方根、求素数的埃拉托斯特
尼筛法(简称埃氏筛),线性方程组求解
第一个算法 欧几里得算法(辗转相除法) 求两个正整数A和B的最大公约数:
并在有限时间内终止。 特性 ① 有穷性:一个算法必须在执行有穷步之后结束。 ② 确定性:算法的每一步骤都必须是确切定义的。
③ 输入:一个算法有0个、1个或多个输入。 ④ 输出:一个算法必须有1个或多个输出值。
⑤ 可行性:算法的每一步操作都应该是可执行的。
1.顺序结构
按照顺序从上向下依次执行A 和B,A和B代表算法的步骤。
鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
假设鸡翁、鸡母、鸡雏分别为a,b,c只,由题意可得如下 两个方程: a+b+c=100 (1) 5a+3b+c/3=100 (2) 采用穷举法,依次对a,b,c取值范围内的各数一一试探,找出 满足方程(1)和(2)的组合。 流程图参见教材4.9。
4.3.7 查找
【案例4.10】在给 定的10个数{8,12, 35,46,55,67, 78,82,90,96}的 列表中查找数35。
4.3.8 排序
1.冒泡排序 将待排序的数据依次进行相邻两个数据的比较,如不符合顺序 要求(由大到小或由小到大)就立即交换。这样值大(或小) 的就会像冒气泡一样逐步升起。按此方法对数据经过一轮比较 移位后称为一趟冒泡,第1趟冒泡的效果是将数据值最大(或 最小)的元素交换到了最后的位置,即该数据排序的最终位置。 n个数据最多需要进行n1趟冒泡。
子了。求猴子第一天共摘了多少个桃子?
4.3.4 迭代
【案例4.6】给定一个数n,判 断n是不是素数。 素数是指只能被1和它自己整 除的数。 可以证明,只需依次用2~
或2~
之间的各数去除n就
可说明n是不是素数。
4.3.5 递归
递归是把一个复杂的问题逐层分解为最 简单问题,再由最简单问题逐层回代, 直到求出问题的解。
求和是对数相加时用到的一种基本方法。 累乘对一系列数的求乘积的方法。 穷举法是依题目的部分条件确定答案的大致范围,在此范围内 对所有可能的情况逐一验证,直到全部情况验证完。
迭代法是从已知的初始条件出发,逐次推出所要求的各中间 结果和最后结果。 递归是把一个复杂的问题逐层分解为最简单问题,再由最简 单问题逐层回代,直到求出问题的解。 顺序查找和二分查找是常用的查找算法,前者适用无序数据, 后者要求数据是有序的。 冒泡排序、选择排序和插入排序是常用的排序算法。 算法的复杂度是指运行算法所需的时间和空间资源的量。
数据(待查找的数据)相等,则查找成功;若目标数据大于
中间位置的数据,则在查找表的后半部分继续进行二分查找, 否则在前半部分进行二分查找。即先确定目标数据所在区域, 然后逐步缩小区域,直到查找成功或失败为止。 【案例4.10】在给定的10个数{8,12,35,46,55,67,78, 82,90,96}的列表中查找数35。
max = b; if(c > max) max = c; return max; }
}
4.3.1 求和
【案例4.2】计算1~100的和。 思考1:如何计算m~n之间的偶数 或奇数之和。
开始 0=>sum 1=>k N k≤100
思考2:如何计算下式:
s 1
1 1 1 ... 12 123 1 2 3 ... n
Step 1: 比较A和B两个数,将A设置为较大的数,B为较小的数;
Step 2: A除以B,得到余数R;
Step 3: 如果R等于0,则最大公约数就是B,否则将B赋值给A, R赋值给B,重复Step2、Step3。
4.1.2 算法的定义和特性
算法 为解决问题采用的方法和步骤。 算法是一组明确步骤的有序集合,它产生结果
1.时间复杂度 算法的时间复杂度(Time Complexity)是指算法执行所 需要的计算工作量。 按数量级递增排列,常见的时间复杂度有:常数阶O(1), 对数阶O(log2n),线性阶O(n)等,线性对数阶O(nlog2n),平 方阶O(n2),立方阶O(n3),...,k次方阶O(nk),指数阶O(2n)。
如果年初养了一对小兔子,到年底时将有多少对兔子? (假
设兔子没有死亡而且严格按照上述规律长大与繁殖) 兔子繁殖的结果
月 1月 兔 小 兔 大 兔 合 计 1 1 1 1
2月
3月
1 1 2
4月
1 2 3
5月
2 3 5
6月
3 5 8
7月
5 8 13
8月
8 13 21
9月
13 21 34
10月 11月 12月
4.2.4 程序设计语言
用程序设计语言(Programming Language)表示算法就是用 计算机高级语言编写程序,程序是可以在计算机上经过编译、
连接、运行出结果的算法表示。
int max( int a, int b, int c) { int max; if(a > b) max = a; else int main(void) { int a, b, c,Imax; scanf("%d%d%d",&a,&b,&c); Imax=max(a, b, c); printf("max=%d", Imax);
Y
sum + k =>sum k+1 => k
结束
4.3.2 累乘
【案例4.3】计算10! 。 思考1:如何计算x 的流程图。 思考2:如何计算下式:
sin( x ) x
n
x3
3!

x5
5!

x7
7!

x9
9!
4.3.3 穷举
【案例4.4】百钱买百鸡。我国古代的《张丘建算经》中有 一个著名的百鸡问题:鸡翁一,值钱五;鸡母一,值钱三;
【案例4.6】年龄问题。有5个人坐在一起,问第5个人 多少岁?他说比第4个人大2岁。问第4个人的岁数,他
说比第3个人大2岁。问第3个人的岁数,他说比第2个人
大2岁。问第2个人,他说比第1个人大2岁。最后问第1 个人,他说是10岁。请问第5个人多大?
4.3.5 递归(续)
4.3.5 递归(续)
【案例4.7】Fibonacci数列。 “兔子繁殖问题”:假定一对小兔子一个月就可以长成大兔 子(一雄一雌),而一对大兔子每个月都会生出一对小兔子。
2.空间复杂度
一个算法的空间复杂度(Space Complexity)是指算法 运行所需的内存大小,包括输入数据所占空间、程序本身 所占空间以及算法执行过程中所需要的辅助空间,其中辅 助空间包括算法程序执行过程中的工作单元以及某种数据 结构所需要的附加存储空间。
算法是为解决问题采用的方法和步骤,它具有5个重要特性: 有穷性、确定性、输入、输出、可行性。 算法有三种结构:顺序、选择(分支)、循环。顺序结构按照 顺序从上向下依次执行算法步骤;选择结构根据给定的条件判 断选择执行相应的步骤;循环结构在给定条件成立时,反复执 行某些算法步骤。 算法的表示有多种方法,常用的有:自然语言、流程图、伪代 码、程序设计语言等。
4.3.2 流程图
常用传统流程图符号 求任意3个 正整数a、b、 c中的最大 者的流程图
4.2.3 伪代码
伪代码(Pseudo-code)又称程序设计语言PDL,是用介于自
然语言和计算机语言之间的文字和符号来描述算法。
read a, b, c if a>b a→max else b→max if c>max c→max print max
4.3.8 排序
2.选择排序 【案例4.12】用选择排序法将N 从待排序的n个数据的列表(R1, (N=7)个无序数据(9, 5, 7, 2, R2, R3,..., Rn)中选出最小的数 4, 8, 3)其按升序排列。 (按升序)或最大的数(按降 序),将它与R1交换;然后再 从余下的n-1个数中选出次小 (或次小)的元素与R2进行交 换;第i趟排序时(R1, R2,..., Ri-1) 已排好序,在当前无序的(Ri,..., Rn)中再选出最小(或最大) 的元素,将它与Ri元素交换,使 (R1, R2,..., Ri)成为有序。依此 类推,经过n-1趟排序后,全部 数据就递增(或递减)有序了。
2.选择结构 根据给定的条件判断选择哪一
条分支,执行相应的步骤。
3.循环结构 在给定条件成立时,反复执行某
些步骤,直到条件不成立为止。
A
A
A
4.3.1 自然语言
自然语言(Natural Language) 人们日常使用的语言。
【案例4.1】求任意3个正整数a、b、c中的最大者。 用自然语言可将算法表示如下: Step 1:输入3个正整数 a,b,c。 Step2:若a大于b,则将a放到max中,否则将b放到max中。 Step 3:若c大于max,则将c放到max中。 Step 4:输出max。
21 34 55 34 55 89 55 89 144
4.3.5 递归(续)
假设第N个月的兔子数目是F(N),可以得到如下公式:
1 N 2 F( N ) F( N 1 ) F( N 2 ) N 2
该公式递归地定义了Fibonacci数列。
4.3.6 两个变量值的交换
4.3.4 迭代
迭代法又称递推法,它是从已知的初始 条件出发,逐次推出所要求的各中间结 果和最后结果。 【案例4.5】猴子吃桃问题。一只猴子第 一天摘下若干桃子,当即吃了一半,还不 过瘾,又多吃了一个,第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后 每天早上都吃了前一天剩下的一半零一个。 到第10天早上想再吃时,见只剩下一个桃
【案例4.8】给2个变量a和b分别输入50和10,然后将大数50 存放在b中,小数10存放在a中。
4.3.7 查找
1.顺序查找
【案例4.9】在给定
的10个数{23,45, 62,12,33,87,90,
55,13,79}组成的
列表中查找数12。
4.3.7 查找
2.二分查找 查找是从列表的中间位置开始,如果该位置上的数据和目标
4.3.8 排序
3.插入排序 把n个待排序的数据分为两 部分:{R1,...,Ri1}为已排 好序的有序表,{Ri, Ri+1,...,Rn}为未排序的无 序表(初始时,令i=2)。 然后,把未排序部分的第1 个数据Ri依次与R1,...,Ri-1 比较,并插入到有序表的 适当位置上,使得{R1,..., Ri}变为一个新的有序表, 直到未排序表中的数据元 素全部插入到有序表中。 【案例4.13】用插入排序法将N (N=5)个无序数据(30, 16, 25, 17, 12)其按升序排列。 初始数据 第1步 第2步 第3步 第4步 [30] [16 [16 [16 [12 16 30] 25 17 16 25 25 30] 25 17 17 17 17 30] 25 12 12 12 12 30]
相关文档
最新文档