《可视化计算》第3章基本算法和策略(A)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
29 http://xqcheng.gr.xjtu.edu.cn
递归过程
一般来说,递归需要有边界条件、递归前 进段和递归返回段
当边界条件不满足时,递归前进; 当边界条件满足时,递归返回
一般递归过程需要通过函数或子程序传递 参数
而RAPTOR中要实现子程序的参数调用,必须使 用其所谓的“中级模式(Intermediate mode) ”
30 http://xqcheng.gr.xjtu.edu.cn
汉诺塔
有A、B、C三根柱子。A柱子上按从小到大 的顺序堆放了N个盘子,要把所有的盘子从 A柱移动到C柱,移动过程中如下要求:
一次只能移动一个盘子; 不允许把大盘放在小盘上面; 盘子只能放在三根柱子上
31
http://xqcheng.gr.xjtu.edu.cn
需要考虑以下因素:
如何保存密码表?可以考虑使用字符串A[],因 为在RAPTOR中,字符串的访问方式与一维数组 完全一样; 加密替换算法,将明文中的字符逐个取出,使 用to_ascii()就可以得到替换密文所需的字符; 解密替换算法,是加密算法的逆运算,需要用 到to_character()函数 为简便起见,测试算法中建议全部输入大写字 母,取消所有单词之间的空格
递归
在数学和计算机科学中,递归是指由一种 (或多种)简单的基线条件(Base case)定义 的一类对象或方法,并规定其他所有情况 都能被还原为其基线条件 具体表现为:一个函数在其定义或说明中 有直接或间接调用自身:
把一个大型复杂的问题层层转化为一个与原问 题相似的规模较小的问题来求解 递归策略只需少量的程序就可描述出解题过程
递推问题求解
由题意可以得到下表:
分析后可知,猴子吃桃问题递推关系为:
Sn=1 (当n=10时) Sn =2×(Sn+1+1)(当1≤n<10时)
在此基础上,以第10天的桃数作为基数, 用以上归纳出来的递推关系设计出一个循 环过程,将第1天的桃数推算出来
15 http://xqcheng.gr.xjtu.edu.cn
小猴子摘桃若干,立即吃了一半 还觉得不过瘾,又多吃了一个;
第二天接着吃剩下桃子的一半,仍 觉得不过瘾又多吃了一个,以后小 猴子都是吃剩下的桃子一半多一个 ; 到第10天小猴子再去吃桃子的时候 ,看到只剩下一个桃子; 则小猴子第一天共摘了多少桃子?
14
http://xqcheng.gr.xjtu.edu.cn
分段函数求解中的问题
最常见的错误的是将函数的数学表达式直 接搬到算法中,例如:“0<=x<=100”; 函数定义中,没有定义x<0,也就是输入为 负数的时候,如何处理。当然,可以实验 一下,当x取负值时结果如何? 这个算法没有设计输入和规范的输出界面 ,例如输入的提示,输出内容的量纲等
11
http://xqcheng.gr.xjtu.edu.cn
字符和字符串运算
字符和字符串运算在算法中的用途有:
在输入输出界面中的应用,如在输出过程中将 计算结果与量纲结合在一起; 在信息安全中的应用,如信息的加密与解密; 对用户对特定应用的输入的字符串,进行模式 正确性的判断(如电子邮件地址需包含“@” 符号)等
21
http://xqcheng.gr.xjtu.edu.cn
模运算
在算法应用中,有一类计算与模运算(求 除法之余数)有关,例如:
一个星期的模为7天 一天的模是24小时或1440分钟 一年的模是12个月(也可以是365或366天)
而模运算在数字比较和诸多计算案例中有 应用
17
http://xqcheng.gr.xjtu.edu.cn
求100~1000范围内的平方回数
32 http://xqcheng.gr.xjtu.edu.cn
汉诺塔递归main子图
33
http://xqcheng.gr.xjtu.edu.cn
汉诺塔递归子程序
34
http://xqcheng.gr.xjtu.edu.cn
斐波那契(Fibonacci)数列
一些问题本身是递归定义的,但它并不适 合用递归算法来求解 如斐波那契(Fibonacci)数列,它的递归定义 为:斐波那契数列为:0、1、1、2、3、 ……,即:
6 http://xqcheng.gr.xjtu.edu.cn
求解流程图
如果需要解决 的问题规模不 大 用蛮力法设计 的算法其速度 是可以接受的
7
http://xqcheng.gr.xjtu.edu.cn
分段函数
收费问题与我们的生活息息相关,如水费 问题、电费问题、话费问题等 这些收费问题往往根据不同的用量,采用 不同的收费方式 以收费为题材的数学问题多以分段函数的 形式出现
所谓平方回数,是指某个数,既是一个回 文数,又是一个平方数, 例如:121是回文数,又是11的平方
18
http://xqcheng.gr.xjtu.edu.cn
模运算求解分析
一个100以上的平方数,必须从平方根大于 等于10的数字开始计算,而1000可以作为 搜索循环的控制变量
但是,如何求出回文数?
第3章 基本算法和策略 PART A
《可视化计算》
学习目标
什么是基本算法? 哪些算法在计算问题求解中最为常用? 算法与算法策略有何区别? 哪些基本的算法策略在各种算法解决方案 中被普遍采用?
2
http://xqcheng.gr.xjtu.edu.cn
基本算法
26 http://xqcheng.gr.xjtu.edu.cn
替换加密
A[]保存明文 Key[]保存密码表 B[]保存密文 解密算法,自行 设计
27
http://xqcheng.gr.xjtu.edu.cn
替换加密的运行结果
28
http://xqcheng.gr.xjtu.edu.cn
23
http://xqcheng.gr.xjtu.edu.cn
ASCII码的分类
字母(a~b,A~B); 数字(0~9); 标点符号
(,.’”;:+-*/()[]{}@!#$%^&_=|?~`)
空格(space) 其他控制符号(例如,CR,LF)
具体符号的编码值参见ASCII码表
可递推求解的问题特点
该类题目一般有以下二个特点:
问题可以划分成多个状态; 除初始状态外,其它各个状态都可以用固定的 递推关系式来表示
在实际解题中,该类题目一般不会直接给 出递推关系式,而是需要通过分析各种状 态,找出递推关系式
13
http://xqcheng.gr.xjtu.edu.cn
猴子吃桃问题
递推法
递推法是利用问题本身所具有的一种递推 关系求解问题的一种方法
Fra Baidu bibliotek
所谓递推,是指从已知的初始条件出发,依据 某种递推关系,逐次推出所要求的各中间结果 及最后结果 其中初始条件或是问题本身已经给定,或是通 过对问题的分析与化简后确定
12
http://xqcheng.gr.xjtu.edu.cn
递推流程图
为了加强交互性,增加了 交互界面,可以输入不同 的天数进行递推 算法使用了两个变量,一 个用于递推的循环控制, 另一个保存递推得到的结 果 注意主要的循环控制变量 是递减的,与题意设计完 全相同,便于理解。 算法中加入了输入数据的 正确性控制,也就是不可 以输入0和负数
16
http://xqcheng.gr.xjtu.edu.cn
8
http://xqcheng.gr.xjtu.edu.cn
阶梯电价问题
为鼓励节约用电,某市开始采取按月用电 量分段收费办法,某户居民每月应交电费y (元)与用电量x(度)的函数如下:
请设计上述电费的收费算法。
9
http://xqcheng.gr.xjtu.edu.cn
阶梯电价流程图
10
http://xqcheng.gr.xjtu.edu.cn
fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2)
35
(当n>1时)
http://xqcheng.gr.xjtu.edu.cn
斐波那契数列的递归求解
36
http://xqcheng.gr.xjtu.edu.cn
递归的辨识
斐波那契递归实现,调用一次产生二个新 的递归,调用次数呈指数增长,时间复杂 度为O(2n)。
这种使用递归的方式,被称为“天真的递归( Naive recursion)”。
而使用递推算法求斐波那契数列,时间复 杂度只是为O(n)
37
http://xqcheng.gr.xjtu.edu.cn
递归算法常用于解决三类问题
(1)数据的定义是按递归定义的 (2)问题解法按递归算法实现 (3)数据的结构形式是按递归定义的 典型的递归算法(带参数传递实现)的运行效 率较低
24
http://xqcheng.gr.xjtu.edu.cn
替换加密
试用以下替换码表,实现通信过程的加密 明码表
ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码表
QWERTYUIOPASDFGHJKLZXCVBNM
25
http://xqcheng.gr.xjtu.edu.cn
替换密码求解
汉诺塔递归求解
N个盘子的移动过程分作3大步:
把A柱上面的N-1个盘子移动到B柱; 把A柱上剩下的一个盘子移动到C柱; 把B柱上面的N-1个盘子移动到C柱;
其中N-1个盘子的移动过程又可按同样的方 法分为三大步,这样就把移动过程转化为 一个递归的过程,直到最后只剩下一个盘 子,按照移动一个盘子的方法移动,递归 结束
RAPTOR的字符串与字符
字符串变量可以用 过输入语句和赋值 语句访问 字符变量用 to_character()函数 和通过字符串访问 得到 两种类型的变量不 可以进行比较
22 http://xqcheng.gr.xjtu.edu.cn
RAPTOR的字符计算
to_character()函数可以把一个数字传换成 ASCII码字符; 逆运算函数to_ascii(),将一个字符串中的某 个字符取出,转换成为数字,以便进行编 码的比较 有了to_ascii() ,就可以进行字符性质的判 断(大写、小写、标点、符号、空格等)
由于是在三位数中求回文数,也就是要求 个位与百位上相等
这个时候,模(在RAPTOR中模运算符:mod) 运算就可以派上用场
19
http://xqcheng.gr.xjtu.edu.cn
求平方回数流程图
请思考一下,这 个算法还使用了 其他什么算法思 想?
20
http://xqcheng.gr.xjtu.edu.cn
5
http://xqcheng.gr.xjtu.edu.cn
蛮力法求解
三种鸡的个数为穷举对象
分别设为x,y,z
以三种鸡的总数(x+y+z)和买鸡用去的钱 的总数(x*5+y*3+z/3)为判定条件,穷举各 种鸡的个数 由于三种鸡的和是固定的,只要穷举二种 鸡(x,y),第三种鸡就可以根据约束条件 求得(z=100-x-y),这样就缩小了穷举范 围
在递归调用的过程当中系统为每一层的返回点 、局部变量等开辟了栈来存储 递归次数过多容易造成栈溢出等问题
38 http://xqcheng.gr.xjtu.edu.cn
RAPTOR与递归
RAPTOR不支持全局变量(子图和子程序皆 可访问的公共变量),如果所有算法参数 要靠子程序参数传递,是极为不现实 理论上而言,所有递归算法都可以用非递 归算法来实现 递归的应用:
蛮力法 分段函数 递推法 模运算 字符和字符串运算 递归 组合计算 迭代法
3 http://xqcheng.gr.xjtu.edu.cn
蛮力法
计算机问题求解的第一号方法被称为蛮力 法(Brute Force) ,也称穷举法 采用蛮力算法解题的基本思路:
确定穷举对象、穷举范围和判定条件; 一一穷举可能的解,验证是否是问题的解
在蛮力算法中,穷举对象的选择也是非常 重要的,它直接影响着算法的时间复杂度 ,选择适当的穷举对象可以获得更高的效 率
4 http://xqcheng.gr.xjtu.edu.cn
百钱买百鸡问题
某个人有一百块钱,打算买一百只鸡。到 市场上一看,公鸡五块钱一只,母鸡三块 钱一只,小鸡一块钱三只。现在,请编一 个算法,算出如何能刚好用一百块钱买一 百只鸡?
递归过程
一般来说,递归需要有边界条件、递归前 进段和递归返回段
当边界条件不满足时,递归前进; 当边界条件满足时,递归返回
一般递归过程需要通过函数或子程序传递 参数
而RAPTOR中要实现子程序的参数调用,必须使 用其所谓的“中级模式(Intermediate mode) ”
30 http://xqcheng.gr.xjtu.edu.cn
汉诺塔
有A、B、C三根柱子。A柱子上按从小到大 的顺序堆放了N个盘子,要把所有的盘子从 A柱移动到C柱,移动过程中如下要求:
一次只能移动一个盘子; 不允许把大盘放在小盘上面; 盘子只能放在三根柱子上
31
http://xqcheng.gr.xjtu.edu.cn
需要考虑以下因素:
如何保存密码表?可以考虑使用字符串A[],因 为在RAPTOR中,字符串的访问方式与一维数组 完全一样; 加密替换算法,将明文中的字符逐个取出,使 用to_ascii()就可以得到替换密文所需的字符; 解密替换算法,是加密算法的逆运算,需要用 到to_character()函数 为简便起见,测试算法中建议全部输入大写字 母,取消所有单词之间的空格
递归
在数学和计算机科学中,递归是指由一种 (或多种)简单的基线条件(Base case)定义 的一类对象或方法,并规定其他所有情况 都能被还原为其基线条件 具体表现为:一个函数在其定义或说明中 有直接或间接调用自身:
把一个大型复杂的问题层层转化为一个与原问 题相似的规模较小的问题来求解 递归策略只需少量的程序就可描述出解题过程
递推问题求解
由题意可以得到下表:
分析后可知,猴子吃桃问题递推关系为:
Sn=1 (当n=10时) Sn =2×(Sn+1+1)(当1≤n<10时)
在此基础上,以第10天的桃数作为基数, 用以上归纳出来的递推关系设计出一个循 环过程,将第1天的桃数推算出来
15 http://xqcheng.gr.xjtu.edu.cn
小猴子摘桃若干,立即吃了一半 还觉得不过瘾,又多吃了一个;
第二天接着吃剩下桃子的一半,仍 觉得不过瘾又多吃了一个,以后小 猴子都是吃剩下的桃子一半多一个 ; 到第10天小猴子再去吃桃子的时候 ,看到只剩下一个桃子; 则小猴子第一天共摘了多少桃子?
14
http://xqcheng.gr.xjtu.edu.cn
分段函数求解中的问题
最常见的错误的是将函数的数学表达式直 接搬到算法中,例如:“0<=x<=100”; 函数定义中,没有定义x<0,也就是输入为 负数的时候,如何处理。当然,可以实验 一下,当x取负值时结果如何? 这个算法没有设计输入和规范的输出界面 ,例如输入的提示,输出内容的量纲等
11
http://xqcheng.gr.xjtu.edu.cn
字符和字符串运算
字符和字符串运算在算法中的用途有:
在输入输出界面中的应用,如在输出过程中将 计算结果与量纲结合在一起; 在信息安全中的应用,如信息的加密与解密; 对用户对特定应用的输入的字符串,进行模式 正确性的判断(如电子邮件地址需包含“@” 符号)等
21
http://xqcheng.gr.xjtu.edu.cn
模运算
在算法应用中,有一类计算与模运算(求 除法之余数)有关,例如:
一个星期的模为7天 一天的模是24小时或1440分钟 一年的模是12个月(也可以是365或366天)
而模运算在数字比较和诸多计算案例中有 应用
17
http://xqcheng.gr.xjtu.edu.cn
求100~1000范围内的平方回数
32 http://xqcheng.gr.xjtu.edu.cn
汉诺塔递归main子图
33
http://xqcheng.gr.xjtu.edu.cn
汉诺塔递归子程序
34
http://xqcheng.gr.xjtu.edu.cn
斐波那契(Fibonacci)数列
一些问题本身是递归定义的,但它并不适 合用递归算法来求解 如斐波那契(Fibonacci)数列,它的递归定义 为:斐波那契数列为:0、1、1、2、3、 ……,即:
6 http://xqcheng.gr.xjtu.edu.cn
求解流程图
如果需要解决 的问题规模不 大 用蛮力法设计 的算法其速度 是可以接受的
7
http://xqcheng.gr.xjtu.edu.cn
分段函数
收费问题与我们的生活息息相关,如水费 问题、电费问题、话费问题等 这些收费问题往往根据不同的用量,采用 不同的收费方式 以收费为题材的数学问题多以分段函数的 形式出现
所谓平方回数,是指某个数,既是一个回 文数,又是一个平方数, 例如:121是回文数,又是11的平方
18
http://xqcheng.gr.xjtu.edu.cn
模运算求解分析
一个100以上的平方数,必须从平方根大于 等于10的数字开始计算,而1000可以作为 搜索循环的控制变量
但是,如何求出回文数?
第3章 基本算法和策略 PART A
《可视化计算》
学习目标
什么是基本算法? 哪些算法在计算问题求解中最为常用? 算法与算法策略有何区别? 哪些基本的算法策略在各种算法解决方案 中被普遍采用?
2
http://xqcheng.gr.xjtu.edu.cn
基本算法
26 http://xqcheng.gr.xjtu.edu.cn
替换加密
A[]保存明文 Key[]保存密码表 B[]保存密文 解密算法,自行 设计
27
http://xqcheng.gr.xjtu.edu.cn
替换加密的运行结果
28
http://xqcheng.gr.xjtu.edu.cn
23
http://xqcheng.gr.xjtu.edu.cn
ASCII码的分类
字母(a~b,A~B); 数字(0~9); 标点符号
(,.’”;:+-*/()[]{}@!#$%^&_=|?~`)
空格(space) 其他控制符号(例如,CR,LF)
具体符号的编码值参见ASCII码表
可递推求解的问题特点
该类题目一般有以下二个特点:
问题可以划分成多个状态; 除初始状态外,其它各个状态都可以用固定的 递推关系式来表示
在实际解题中,该类题目一般不会直接给 出递推关系式,而是需要通过分析各种状 态,找出递推关系式
13
http://xqcheng.gr.xjtu.edu.cn
猴子吃桃问题
递推法
递推法是利用问题本身所具有的一种递推 关系求解问题的一种方法
Fra Baidu bibliotek
所谓递推,是指从已知的初始条件出发,依据 某种递推关系,逐次推出所要求的各中间结果 及最后结果 其中初始条件或是问题本身已经给定,或是通 过对问题的分析与化简后确定
12
http://xqcheng.gr.xjtu.edu.cn
递推流程图
为了加强交互性,增加了 交互界面,可以输入不同 的天数进行递推 算法使用了两个变量,一 个用于递推的循环控制, 另一个保存递推得到的结 果 注意主要的循环控制变量 是递减的,与题意设计完 全相同,便于理解。 算法中加入了输入数据的 正确性控制,也就是不可 以输入0和负数
16
http://xqcheng.gr.xjtu.edu.cn
8
http://xqcheng.gr.xjtu.edu.cn
阶梯电价问题
为鼓励节约用电,某市开始采取按月用电 量分段收费办法,某户居民每月应交电费y (元)与用电量x(度)的函数如下:
请设计上述电费的收费算法。
9
http://xqcheng.gr.xjtu.edu.cn
阶梯电价流程图
10
http://xqcheng.gr.xjtu.edu.cn
fib(0)=0; fib(1)=1; fib(n)=fib(n-1)+fib(n-2)
35
(当n>1时)
http://xqcheng.gr.xjtu.edu.cn
斐波那契数列的递归求解
36
http://xqcheng.gr.xjtu.edu.cn
递归的辨识
斐波那契递归实现,调用一次产生二个新 的递归,调用次数呈指数增长,时间复杂 度为O(2n)。
这种使用递归的方式,被称为“天真的递归( Naive recursion)”。
而使用递推算法求斐波那契数列,时间复 杂度只是为O(n)
37
http://xqcheng.gr.xjtu.edu.cn
递归算法常用于解决三类问题
(1)数据的定义是按递归定义的 (2)问题解法按递归算法实现 (3)数据的结构形式是按递归定义的 典型的递归算法(带参数传递实现)的运行效 率较低
24
http://xqcheng.gr.xjtu.edu.cn
替换加密
试用以下替换码表,实现通信过程的加密 明码表
ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码表
QWERTYUIOPASDFGHJKLZXCVBNM
25
http://xqcheng.gr.xjtu.edu.cn
替换密码求解
汉诺塔递归求解
N个盘子的移动过程分作3大步:
把A柱上面的N-1个盘子移动到B柱; 把A柱上剩下的一个盘子移动到C柱; 把B柱上面的N-1个盘子移动到C柱;
其中N-1个盘子的移动过程又可按同样的方 法分为三大步,这样就把移动过程转化为 一个递归的过程,直到最后只剩下一个盘 子,按照移动一个盘子的方法移动,递归 结束
RAPTOR的字符串与字符
字符串变量可以用 过输入语句和赋值 语句访问 字符变量用 to_character()函数 和通过字符串访问 得到 两种类型的变量不 可以进行比较
22 http://xqcheng.gr.xjtu.edu.cn
RAPTOR的字符计算
to_character()函数可以把一个数字传换成 ASCII码字符; 逆运算函数to_ascii(),将一个字符串中的某 个字符取出,转换成为数字,以便进行编 码的比较 有了to_ascii() ,就可以进行字符性质的判 断(大写、小写、标点、符号、空格等)
由于是在三位数中求回文数,也就是要求 个位与百位上相等
这个时候,模(在RAPTOR中模运算符:mod) 运算就可以派上用场
19
http://xqcheng.gr.xjtu.edu.cn
求平方回数流程图
请思考一下,这 个算法还使用了 其他什么算法思 想?
20
http://xqcheng.gr.xjtu.edu.cn
5
http://xqcheng.gr.xjtu.edu.cn
蛮力法求解
三种鸡的个数为穷举对象
分别设为x,y,z
以三种鸡的总数(x+y+z)和买鸡用去的钱 的总数(x*5+y*3+z/3)为判定条件,穷举各 种鸡的个数 由于三种鸡的和是固定的,只要穷举二种 鸡(x,y),第三种鸡就可以根据约束条件 求得(z=100-x-y),这样就缩小了穷举范 围
在递归调用的过程当中系统为每一层的返回点 、局部变量等开辟了栈来存储 递归次数过多容易造成栈溢出等问题
38 http://xqcheng.gr.xjtu.edu.cn
RAPTOR与递归
RAPTOR不支持全局变量(子图和子程序皆 可访问的公共变量),如果所有算法参数 要靠子程序参数传递,是极为不现实 理论上而言,所有递归算法都可以用非递 归算法来实现 递归的应用:
蛮力法 分段函数 递推法 模运算 字符和字符串运算 递归 组合计算 迭代法
3 http://xqcheng.gr.xjtu.edu.cn
蛮力法
计算机问题求解的第一号方法被称为蛮力 法(Brute Force) ,也称穷举法 采用蛮力算法解题的基本思路:
确定穷举对象、穷举范围和判定条件; 一一穷举可能的解,验证是否是问题的解
在蛮力算法中,穷举对象的选择也是非常 重要的,它直接影响着算法的时间复杂度 ,选择适当的穷举对象可以获得更高的效 率
4 http://xqcheng.gr.xjtu.edu.cn
百钱买百鸡问题
某个人有一百块钱,打算买一百只鸡。到 市场上一看,公鸡五块钱一只,母鸡三块 钱一只,小鸡一块钱三只。现在,请编一 个算法,算出如何能刚好用一百块钱买一 百只鸡?