计算机程序设计竞赛-第1讲
(2) for(k=1;k<=n;k++) { x=x+y; y=x+y; s=x+y; } “k=1”执行1次;“k<=n”与“k++”各执行n次;3个赋值语 句,每个赋值语句各执行n次;共执行5n+1次. 时间复杂度
为O(n).
1.5 算法复杂度的分析
例1-3 试计算下面三个程序段的执行频数
(3) for(t=1,k=1;k<=n;k++) { t=t*2; for(j=1;j<=t;j++) s=s+j; }
算法是解决“做什么”和“怎么做”的问题。即是为 解决一个问题而采取的方法和步骤。
1.2 简单算法举例
ቤተ መጻሕፍቲ ባይዱ
步骤1:先求1×2,得到结果2
步骤2:将步骤1得到的乘积2再乘以
3,得到结果6 步骤3:将6再乘以4,得24
步骤4:将24再乘以5,得120
1.2 简单算法举例
何为算法
“烧水泡茶”有如下五道工序: 1、烧开水2、洗茶壶3、茶杯4、拿茶叶5、泡茶。 烧开水、洗茶壶、茶杯,拿茶叶是泡茶的前提。其中烧开水需要15分 钟,洗茶壶需要2分钟,洗茶杯需要1分钟,拿茶叶需要1分钟,泡茶需 要1分钟。 下面是两种“烧水泡茶”的方法。 方法1: 第一步:烧水; 第二步:水烧开后,洗刷茶具,拿茶叶; 第三步:沏茶。 方法2: 第一步:烧水; 第二步:烧水过程中,洗刷茶具,拿茶叶; 第三步:水烧开后沏茶。
1.4 算法的表示
例5: “打印x的绝对值” ,用伪代码表示算法。
用英文伪代码表示:
IF x is positive THEN print x ELSE print -x
也可以用汉字伪代码表示:
若 x为正 打印 x
打印 -x
也可以中英文混用,如:
IF x print x ELSE print -x
一个算法的运行时间取决于算法所需执行的语句(运算)的
多少。 算法的时间复杂度通常用该算法执行的总语句(运算)的数 量级决定。
1.5 算法复杂度的分析
算法的执行频数的数量级直接决定算法的时间复杂 度。
1.5 算法复杂度的分析
(1) x=x+1; s=s+x; 2个语句各执行1次,共执行2次。时间复杂度为O(1)
2.1 经典算法——枚举法
(2)恒心、演练、举一反三
学习编程的过程是枯燥的过程,我们需要将学习算法当成是自己的乐趣
,只有做到持之以恒才能有机会学好。另外编程最注重实践,最害怕闭门造车
。每一个语法,每一个知识点,都要反复用实例来演练,这样才能加深对知识 的理解。并且要做到举一反三,只有这样才能对知识的深入理解。
(3)语言之争的时代更要学会坚持
例6:求5!用C语言表示。
N-S图为:
1 t
2 i
当i<=5
t*it
i+1i 输出t
#include <stdio.h> int main( ) { int i,t; t=1; i=2; while(i<=5) { t=t*i; i=i+1; } printf(″%d\n″,t); return 0; }
1.5 算法复杂度的分析
算法的复杂性越高,所需的计算机资源越多。 最重要的计算机资源是时间资源与空间资源。 需要计算机时间资源的量称为时间复杂度,需要计算机空 间资源的量称为空间复杂度。 时间复杂度与空间复杂度集中反映算法的效率。
1.5 算法复杂度的分析
一个算法的时间复杂度是指算法运行所需的时间。
// 统计解的个数
2.1 经典算法——枚举法
举例:完美综合式
案例提出:
把数字1,2,...,9这9个数字分别填入以下含加、减、乘、除
与乘方(^)的综合运算式中的9个□中
□^□+□□÷□□-□□×□=0 要求数字1,2,...,9这9个数字在式中出现一次且只出现一次, 且约定数字“1”不出现在乘、乘方的一位数中。
算法用N-S图表示,如右图。
1 i
输入ni、gi i+1i 直到i>50
练习:使用流程图表示算法。
是
1 i
gi≧80 否
输出ni,gi
i+1i 直到i>50
1.4 算法的表示
例3 流程图如下:
开始
Y 1 i 输出ni、gi 输入ni、gi i+1i N i>50 N i+1i i>50 Y gi≧80 N
1.3 算法的特性
有穷性 一个算法应包含有限的操作步骤,而不能是无限的。 确定性 算法中的每一个步骤都应当是确定的,不能含糊。 输入 输出
有零个或多个输入,从外界获取必要信息。 有一个或者多个输出,得到问题的解。
有效性 每一个步骤有效执行,得到确定的结果。
1.4 算法的表示
算法的表示
自然语言
当型循环结构
直到型循环结构
1.4 算法的表示
N-S流程图( N-S图) 由I. Nassi和Shneiderman提出的新的流程图形式,称为 N-S流程图。其三种基本结构的N-S图表示:
A Y
p
N B A
当p1成立 A
循环结构 (当型)
A 直到p2成立 循环结构 (直到型)
B
顺序结构
选择结构
1.4 算法的表示
23
1.4 算法的表示
用计算机语言表示算法
概念: 用计算机语言描述算法,就是用计算机语言编写程序。 计算机是无法识别流程图和伪代码的。只有用计算机语 言编写的程序才能被计算机执行。
特点:
设计算法的目的是为了实现算法。 用计算机语言表示算法,必须严格遵循所用的语言的语法 规则。
1.4 算法的表示
1.4 算法的表示
算法
广义地说,为解决一个问题而采取的方法和步骤,称为“算法”。
对同一个问题,可以有不同的算法。
计算机算法可分为两大类别:
数值运算算法,目的是求数值解。 非数值运算算法,包括的面十分广泛,最常见的是用于事务管理领 域。
注意:
写出了C程序,仍然只是描述了算法,并未实现算法。 只有运行程序才是实现算法。
2.经典算法
九大大算法思想
枚举算法思想 递推算法思想 递归算法思想 分治算法思想 贪心算法思想 试探法算法思想 迭代算法思想 动态规划算法思想 模拟算法思想
2.1 经典算法——枚举法
比较笨的枚举算法思想
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件
判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法
1.4 算法的表示
例4 判定2000 - 2500年中的每一年是否闰年,并将结果输出 开始 。
2000year year不能被4整除 N
year不能被100整除
Y year不是闰年 Y
year不能被400整除
N
Y year是闰年 year+1year year>2500 N
N
year不是闰年
1.4 算法的表示
流程图的连接点举例
①
③
② ③ ③
位置 不够
防止 交叉
①
②
1.4 算法的表示
流程图表示三种基本结构
顺序结构
A
B
1.4 算法的表示
流程图表示三种基本结构
选择结构 Y N Y N
p
p
A
B
A
1.4 算法的表示
流程图表示三种基本结构
循环结构
p1 Y A
N
A N p2 Y
计算机程序设计竞赛
信科系专职教师:赵小蕾
邮箱:zxl_xinhua@
课程介绍及要求
课程类别:全校公选课 总学时数:36(实操课) 开课目的:为信息科学系——竞赛项目:第六届“蓝 桥杯软件人才与设计大赛”培养人才。
主要培养学生解决实际问题的编程能力、培养学生的
创新思维。程序是自己设计出来的,而不是某个固定 的方程式。
1.5 算法复杂度的分析
算法的空间复杂度是指算法运行的存储空间,是实现算 法所需的内存空间的大小。 一个程序运行所需的存储空间通常包括固定空间需求与
可变空间需求两部分。
1. 固定空间需求包括程序代码、常量与静态变量等所占 的空间。 2. 可变空间需求包括局部作用域非静态变量所占用的空 间、从堆空间中动态分配的空间与调用函数所需的系
“t=1”与“k=1”各执行1次;“k<=n”与“k++”各执行n次;“t=t*2”执行n次; “j=1”执行n次;“j<=t”、“j++”与内循环的赋值语句“s=s+j”各执行频数为: 总的执行频数为:
1.5 算法复杂度的分析
在估算算法的时间复杂度时,为简单计,以后只考虑内循环 语句的执行频数,而不细致计算各循环设计语句及其它语句的执 行次数,这样简化处理不影响算法的时间复杂度。 例1-4 估算以下程序段所代表算法的时间复杂度。 for(k=1;k<=n;k++) for(j=1;j<=k;j++) { x=k+j; s=s+x;} 每个赋值语句执行频率为n(n+1)/2, 该算法的时间复杂度 为:O(n^2)
输出 year 闰年
1.4 算法的表示
用伪代码表示算法 概念:
伪代码是用介于自然语言和计算机语言之间的文字和符
号,用来描述算法。
特点:
如一篇文章,自上而下地写下来。每一行(或几行)表示 一个基本操作。它不用图形符号,因此书写方便 、格式紧 凑,也比较好懂,也便于向计算机语言算法(即程序)过渡 。