算法及其描述
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2.1 时间复杂度
要想充分理解算法并有效地应用算法求解实际案 关键是对算法的分析。通常我们可以利用实 例,关键是对算法的分析。通常我们可以利用实 验对比方法、数学方法来分析算法 验对比方法、数学方法来分析算法。 实验对比分析很简单, 实验对比分析很简单,两个算法相互比较求解时 间。 数学方法能在严密的逻辑推理基础上判断算法的 优劣。 优劣。 在算法分析中,我们往往采用能近似表达性能的 在算法分析中, 方法来展示某个算法的性能指标。 方法来展示某个算法的性能指标。
可以证明, 是存在的,且不大于2011, 可以证明,n是存在的,且不大于2011,因而以 2011 上竖式运算总会停止。当除运算的余数为“ 上竖式运算总会停止。当除运算的余数为“0” 数一数被除数中有多少个“1”即可 即可。 时,数一数被除数中有多少个“1”即可。 设整数竖式除法每次试商的被除数为a, 设整数竖式除法每次试商的被除数为a, 除数为 2011,每次试商的余数为c 2011,每次试商的余数为c。 循环以余数c≠0作为循环条件。循环外赋初值: c≠0作为循环条件 循环以余数c≠0作为循环条件。循环外赋初值: c=1111,n=4或c=111,n=3等等 等等。 c=1111,n=4或c=111,n=3等等。 设置竖式除法模拟循环, 设置竖式除法模拟循环,循环中被除数 a=c*10+1,试商余数c=a%2011 c=a%2011。 a=c*10+1,试商余数c=a%2011。 若余数c=0 结束循环,输出结果; c=0, 若余数c=0,结束循环,输出结果; 否则,计算a=c*10+1为下一轮运算的被除数, a=c*10+1为下一轮运算的被除数 否则,计算a=c*10+1为下一轮运算的被除数, 继续试商。每商一位,统计被除数中“1”的个 继续试商。每商一位,统计被除数中“1”的个 数的变量n 数的变量n增1。
注重算法设计,提高解决实际案例的能力。
第1章
算法与程序设计概述
教学要求
了解算法概念、 了解算法概念、算法特征及算法的描述 算法概念 建立算法的复杂性概念 建立算法的复杂性概念 掌握结构化程序设计的基本方法 掌握结构化程序设计的基本方法 程序设计
本章重点
应用 c 语言描述算法 掌握算法时间复杂度分析
对算法的改进与优化,主要表现在有效缩减 对算法的改进与优化, 算法的运行时间与所占空间。 算法的运行时间与所占空间。
1.2.2 空间复杂度 算法的空间复杂度是指算法运行的存储空间, 是实现算法所需的内存空间的大小。 一个程序运行所需的存储空间通常包括固定空间 需求与可变空间需求两部分。 需求与可变空间需求两部分。 1. 固定空间需求包括程序代码、常量与静态变量 固定空间需求包括程序代码、 等所占的空间。 等所占的空间。 2. 可变空间需求包括局部作用域非静态变量所占 用的空间、 用的空间、从堆空间中动态分配的空间与调用 函数所需的系统栈空间等。 函数所需的系统栈空间等。
时间复杂度符号O的两个定理: 时间复杂度符号O的两个定理:
在估算算法的时间复杂度时,为简单计, 在估算算法的时间复杂度时,为简单计,以后 只考虑内循环语句的执行频数, 只考虑内循环语句的执行频数,而不细致计算 各循环设计语句及其它语句的执行次数, 各循环设计语句及其它语句的执行次数,这样 简化处理不影响算法的时间复杂度。 简化处理不影响算法的时间复杂度。 例1-4 估算以下程序段所代表算法的时间复杂度。 for(k=1;k<=n;k++) for(j=1;j<=k;j++) { x=k+j; s=s+x;}
1. 算法的三要素
算法由操作、 算法由操作、控制结构与数据结构 三者组成。 三者组成。
(1) 操作:算术运算,关系运算,逻辑运算; 操作:算术运算,关系运算,逻辑运算; 输入、输出、赋值等操作。 输入、输出、赋值等操作。 (2) 控制结构:顺序结构,选择结构,循环 控制结构:顺序结构,选择结构, 结构,模块调用。 结构,模块调用。 (3) 数据结构:数据之间的逻辑关系。 数据结构:数据之间的逻辑关系。
“k=1”执行 “k=1”执行1次;“k<=n”与“k++”各执行n次;3个赋值语句,每个 执行1 k<=n”与 k++”各执行 各执行n 个赋值语句, 赋值语句各执行n 赋值语句各执行n次;共执行5n+1次. 共执行5n+1 5n+1次 时间复杂度为O(n). 时间复杂度为O(n).
例1-3 试计算下面三个程序段的执行频数
源自文库
例1-1 求两个整数a,b的最大公约 求两个整数a,b的最大公约 数的欧几里德算法
(1) 数 a 除以 b 得余数 r;若r=0,则b为 r=0, 所求的最大公约数。 所求的最大公约数。 r≠0, 继续(1). (2) 若 r≠0,以b为a,r为b,继续(1). 欧几里德算法具体描述如下: 欧几里德算法具体描述如下:
计算机常用算法与 程序设计案例教程
杨克昌
请用PowerPoint 2003播放 请用PowerPoint 2003播放
学时安排:36(讲授)+18(上机) )+18 学时安排:36(讲授)+18(上机)
( 可根据实际教学计划进行调整) 可根据实际教学计划进行调整)
课堂讲授 : 各常用算法的概念与设计要点。 各常用算法的概念与设计要点。 重点讲授应用算法设计求解基本的典型案例 应用算法设计求解基本的典型案例, 重点讲授应用算法设计求解基本的典型案例,并 通过相关程序,引导设计变通。 通过相关程序,引导设计变通。 在基本案例引导下自学相关联案例求解。 自学相关联案例求解 在基本案例引导下自学相关联案例求解。 小组讨论与基本案例相关的拓展与引申案例求解 与基本案例相关的拓展与引申案例求解, 小组讨论与基本案例相关的拓展与引申案例求解, 课程设计”作准备。 为“课程设计”作准备。
(3) for(t=1,k=1;k<=n;k++) { t=t*2; for(j=1;j<=t;j++) s=s+j; }
“t=1”与 k=1”各执行 “t=1”与“k=1”各执行1次;“k<=n”与“k++”各 各执行1 k<=n”与 k++”各 执行n t=t*2”执行 执行n j=1”执行 执行n 执行n次;“t=t*2”执行n次;“j=1”执行n次; j<=t”、 j++”与内循环的赋值语句 s=s+j”各 与内循环的赋值语句“ “j<=t”、“j++”与内循环的赋值语句“s=s+j”各 执行频数为: 执行频数为: 总的执行频数为: 总的执行频数为:
input(a,b); input(a,b); // 输入的简略表示 r=a%b; while(r!=0) // 实施辗转相除 { a=b; b=r; r=a%b; } print(b); // 输出的简略表示
例1-2 由n个1组成的整数能被2011整 组成的整数能被2011整 除,求n 除,求n至少为多大? (1) 试模拟整数竖式除法: 试模拟整数竖式除法:
对于一个实用算法,我们通常不必深入研究它 对于一个实用算法, 时间复杂度的上界和下界, 时间复杂度的上界和下界,只需要了解该算法 的特性,然后在合适的时候应用它。 的特性,然后在合适的时候应用它。 为了求解某一问题,设计出复杂性尽可能低的算 为了求解某一问题,设计出复杂性尽可能低的算 法是追求的重要目标。或者说,求解某一问题有多 种算法时,选择其中复杂性最低的算法是选用算法 种算法时,选择其中复杂性最低的算法是选用算法 的重要准则。 的重要准则。
一个算法的时间复杂度是指算法运行所需的时 间。 一个算法的运行时间取决于算法所需执行的语 运算)的多少。 句(运算)的多少。 算法的时间复杂度通常用该算法执行的总语句 运算)的数量级决定。 (运算)的数量级决定。 一条语句的数量级即执行它的频数,一个算 一条语句的数量级即执行它的频数, 法的数量级是指它所有语句执行频数之和。 法的数量级是指它所有语句执行频数之和。 在分析算法时, 在分析算法时,隐藏细节的数学表示方法为 大写字母“ 记法, 大写字母“O”记法,它可以帮助我们简化算 法复杂度计算的许多细节, 法复杂度计算的许多细节,提取主要成分。
算法的执行频数的数量级直接决定算 法的时间复杂度。 法的时间复杂度。
例1-3 试计算下面三个程序段的时间复杂度
(1) x=x+1; s=s+x; 2个语句各执行1次,共执行2次。时间复杂度为O(1) 个语句各执行1 共执行2 时间复杂度为O(1) (2) for(k=1;k<=n;k++) { x=x+y; y=x+y; s=x+y; }
2. 算法的基本特征
一个算法由有限条可完全机械地执 行的、有确定结果的指令组成, 行的、有确定结果的指令组成,具 有以下特性: 有以下特性:
(1) (2) (3) (4) (5) 确定性 可行性 有穷性 算法有零个或多个输入 算法有一个或多个输出
1.1.2 算法描述
(1)一个问题可以设计不同的算法来求解; 一个问题可以设计不同的算法来求解; 同一个算法可以采用不同的形式来表述。 同一个算法可以采用不同的形式来表述。 描述算法可以有:自然语言方式、 (2)描述算法可以有:自然语言方式、流程 图方式、伪代码方式、 图方式、伪代码方式、计算机语言表示方 式与表格方式等 式与表格方式等。 (3)当一个算法使用计算机程序设计语言描 述时,就是程序。 述时,就是程序。 本书采用C 本书采用C语言与自然语言相结合来描述算 法。
上机实践: 上机实践: • 上机环境:VC++6.0 上机环境: • 上机通过每章指定的案例求解程序与习题 • 按要求填写实验报告 学习建议: 学习建议: • • 学会归纳、总结和提炼; • • 自觉调整学习状态: 培养案例求解兴趣 自觉完成布置的作业 加深对算法应用的理解 善于变通、 善于变通、拓展与改进
1.1 算法及其描述
算法是程序设计的基础,是计算机科学的核心。 算法是程序设计的基础,是计算机科学的核心。 1.1.1 算法定义 算法是计算机解决问题的过程, 算法是计算机解决问题的过程,是解决某一 问题的运算序列。或者说算法是问题求解过 问题的运算序列。或者说算法是问题求解过 程的运算描述。 程的运算描述。 当面临某一问题时, 当面临某一问题时,需要找到用计算机解决 这个问题的方法与步骤,算法就是解决这个 这个问题的方法与步骤,算法就是解决这个 问题的方法与步骤的描述。 问题的方法与步骤的描述。
每个赋值语句执行频率为n(n+1)/2, 每个赋值语句执行频率为n(n+1)/2, 该算法 的时间复杂度为:O(n^2) 的时间复杂度为:O(n^2)
一个算法的运行时间,与问题的规模相关,也 一个算法的运行时间,与问题的规模相关, 与输入的数据相关。 与输入的数据相关。
例如对给定的n个整数a(1),a(2),…,a(n) 排序: 例如对给定的n个整数a(1),a(2),…,a(n) 排序: for(i=1;i<=n− for(i=1;i<=n−1;i++) for(j=i+1;j<=n;j++) if(a[i]>a[j]){ h=a[i];a[i]=a[j];a[j]=h;} 3个赋值语句的执行频数之和,最理想的情形下 个赋值语句的执行频数之和, 为零(当所有n个整数已从小到大排列时), ),最坏情 为零(当所有n个整数已从小到大排列时),最坏情 形下为3n(n−1)/2( 个整数为从大到小排列时)。 形下为3n(n−1)/2(当n个整数为从大到小排列时)。 按平均情形来分析,其时间复杂度为O(n^2)。 按平均情形来分析,其时间复杂度为O(n^2)。
(2) 竖式除法模拟描述
c=1111;n=4; while(c!=0) { a=c*10+1; c=a%2011; n=n+1; } print(n); // // 变量c 变量c与n赋初值 模拟竖式除法
// 每试商一位n增1 每试商一位n
// 输出的简略表示
1.2 算法的复杂性分析
算法的复杂性越高,所需的计算机资源 算法的复杂性越高, 越多。 越多。 最重要的计算机资源是时间资源与空间 资源。 资源。 需要计算机时间资源的量称为时间复杂 度,需要计算机空间资源的量称为空间 复杂度。 复杂度。 时间复杂度与空间复杂度集中反映算法 的效率。 的效率。