大学计算机-数据的处理-算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//交换 v(i) ,v(k)
【思考】
随机排列6个形状大小一样但重量不同的砝码,使用选择 排序法将它们按重量从小到大排序。问一共需要比较多少 次?
找到第1个最轻的砝码需要比较5次,找到次轻的砝码需要 比较4次,依此类推,最终需要比较:5+4+3+2+1=15次。 因此,对于大数据量来说,选择排序算法并不是个好方法, 如果用该方法对1000个数据排序,将需要比较近50万次!
• 2.算法的流程图描述
【例4-2】求1+2+3+…+100 的和。用流程图描述算 法。
分析:设1~100的累加和放 在变量s中,这个问题的 本质就是重复做累加的 动作:s=s+i,让加数项 i从1变化到100。流程图 如下:
用图形化方法描述算法形象直观,但它最大的不足是画画“麻烦”。
3.算法的伪代码描述
数据的处理——算法
目录
• • • • • • • • • • • • • • • 1 引子:渡河游戏 2 算法 2.1 算法的控制结构 2.2 算法的表示 2.3 排序算法 2.4 查找算法 3 算法策略 3.1 枚举算法:百钱买百鸡 3.2 递归算法:汉诺塔问题 3.3 回溯算法:八皇后问题 3.4 分治算法:找出伪币 3.5 并行算法:国王的婚姻 4 可计算性与计算的复杂性 4.1 计算机处理的局限性 4.2 计算复杂性与可计算性
1.算法的自然语言描述 【例4-1】数组v有10个元素,即v(1), v(2)……v(10),求 其中的最大数。 • 分析:求最大数常用的方法就是——“打擂台”。一圈 “擂台”打下来,最终站在“擂台”上的就是最大值。 • 算法描述如下: • 步骤1:假设v(1)为最大数,令max为v(1) • 步骤2:max与后面的所有数v(i)(i=2……10)逐个比较: • 若max小于v(i) 则令max=v(i) • 步骤3:打印输出max的值,即为数组v的最大值 上述用自然语言描述的算法,其优点是语言熟悉,易懂, 缺点是繁琐冗长,易产生歧义。
重点和难点
• 重点: 什么是算法?算法的控制结构。 几个常用排序算法的理解。 顺序和二分查找算法的理解。 典型算法策略的理解。 • 难点: 算法的描述。 不同算法的优劣比较。 计算复杂性和可计算性。
1 引子:渡河游戏
两个大人和两个小孩一起渡河,渡口只有一条小船,每次 只能渡1 个大人或两个小孩,他们四人都会划船,但都不 会游泳,试问他们怎样渡过河去?请写出一个渡河方案。
上述公式意思就是程序是由一种解决问题的方法加上和解 决方法有关的数据组成的。比如:你要做一道菜“香菇炒 青菜”——这就是一个程序。而你的算法就是……,你的 数据就是……。由这些数据加上算法(你做菜时采用的策 略)就是程序。 这个公式揭示了:不能离开数据结构去抽象地分析程序的 算法,也不能脱离算法去孤立地研究程序的数据结构,而 只能从算法与数据结构统一上去认识程序。
算法的基本思想就是我们分析问题时的想法,由于想法不 同、思考问题的角度不同、着眼点不一样,对同一个问题, 可以有不同的解题方法和步骤。 方法有优劣之分,有的方法只需进行很少的步骤,而有些 方法则需要较多的步骤。因此,为了有效地进行解题,不 仅需要保证算法正确,还要考虑算法的质量,选择合适的 算法。 进一步说,既然算法是解决给定问题的方法,算法的处理 对象就必然是该问题所涉及的相关数据,程序的目的是加 工数据,而如何加工数据是算法的问题。程序就是数据结 构与算法的统一,因此有如下著名公式: • 程序=算法+数据结构
原始数据: 第1轮选择: 第2轮选择: 第3轮选择: 第4轮选择: 第5轮选择: 最后结果: 8 (1) 1 1 1 1 1 3 3 (2) 2 2 2 2 5 5 5 (3) 3 3 3 2 2 (3) (5) (4) 4 4 4 4 4 4 (5) (5) 5 1 (8) 8 8 8 8 8 本轮找到最小数1交换到第1个位置上 本轮找到最小数2交换到第2个位置上 本轮找到最小数3交换到第3个位置上 本轮找到最小数4交换到第4个位置上 本轮找到最小数5交换到第5个位置上
根据条件,我们考虑如下方案: S1:两个小孩同船过河去 S2:一个小孩划船回来; S3:一个大人划船过河去 S4:对岸的小孩划船回来; S5:两个小孩同船渡过河去; S6:一个小孩划船回来; S7:余下的一个大人独自划船渡过河去; S8:对岸的小孩划船回来; S9:两个小孩再同时划船渡过河去。
按照上述渡船的步骤一定可以把两个大人和两个小孩渡到 河对岸去。 因此,在解决问题时,按预先设计好的一系列可操作或可 计算的步骤完成任务,这些解决问题的方法和步骤就是算 法。 本章我们就来学习算法,算法是程序的灵魂,也是计算机 的灵魂,计算机中所有执行的程序都有算法,算法有好坏 之分,有些问题到目前为止还没有找到好的算法。
【思考】
有7个形状大小一样但重量不同的砝码,请按重量从小到 大排序。 由于砝码的形状大小一样,所以没有办法通过目测来区分 哪个重哪个轻,只有一个办法,就是用天平秤。天平秤的 时候只能两两比较,假如从7个砝码中找出最轻的那个, 要称6次才能辨别出来。 这里之所以用“形状大小一样但重量不同的砝码”来排序, 主要是要大家注意计算机只能两两比较大小,不能象人那 样一“看”就能在多个数中找出最小数。这是计算机排序 的基本前提。
总结: n个元素需要“查找-交换”n-1次。
• • • • • • •
选择排序算法描述如下: 循环(i 从1到n-1) ki 循环(j 从i+1 到n) 若(v(j)<v(k)) 那么 kj 若(k≠i)则 • tempv(i) • v(i) v(k) • v(k) temp
//找最小值
2 算法
其实,日常生活中处处都有“算法”,如烧一壶水的算法 如下: • (1)往壶内注水; • (2)点火加热; • (3)观察:如果水开,则停止烧火,否则继续烧火并重 复第3步; 再比如菜谱中描述的“西红柿炒鸡蛋”的制作过程就是一 个算法,一首贝多芬“命运”的钢琴曲谱就是一个算法。 事实上,我们完成任何事,都要有一个明确的步骤,合理 安排步骤,就会达到事半功倍的效果。
2.1算法的控制结构
在计算机程序解决问题的过程中,一个算法的功能不仅取 决于所选用的操作,而且还决定于各操作之间的执行顺序, 即控制结构。 算法的控制结构给出了算法的框架,决定了各操作的执行 次序。 用流程图可以形象地表示出算法的控制结构。
• 1.顺序结构 程序执行时按部就班,从上到下依次执行。 • 2.选择结构 根据条件进行判断,再决定具体的执行步骤。 • 3.循环结构 根据条件判断,反复做某一部分操作。
Leabharlann Baidu
要把这7个砝码按重量从小到大排序,我们想出的最简单 的方法就是先找到最轻的那个,放在第1个位置;在留下 的6个砝码再找最轻的,放在第2个位置上;… 每次在余下的砝码中找最轻的那个放在已排序的砝码的后 面,这就是选择排序算法的基本思想。
选择最轻的砝码
10
40
60
50
20
70
30
• 1.选择排序 选择排序的基本思想:每一趟从待排序的元素中选出最小 的数,放在已排好序的序列的最后面,直到全部记录排序 完毕。 【例4-4】对数据元素序列v(6)={8,3,5,2,4,1},用 选择法排序。 【解】算法思想:
任何复杂的算法都可以用顺序、选择、循环三种控制结构 组合而成,称之为算法的三种基本控制结构。 如果把每种基本控制结构看成是一个积木,则整个算法便 是由这三种积木搭建而成的,这样的算法结构清晰,容易 阅读也容易理解,我们称之为结构化的算法。
2.2算法的表示
有了求解问题的方法、思路后,就必须用一种规范的,可 读性强的,容易转换成程序的形式描述出来。 程序是计算机语言描述的算法,流程图是图形化了的算法。 除此之外,算法的描述方法还有自然语言、伪代码等。
• 【例4-3】求三角形面积 • 设三角形三边长分别为a、b、c,借助海伦公式s=计算三 角形面积S,其中p为半周长。请用伪代码描述。
分析:用海伦公式求三角形面积,需要知道三边长,如果这 三边长能构成三角形,则可以先计算半周长P,再计算面 积S。
• • • • • • • •
算法描述如下: 输入a,b,c 若(a+b>c 且b+c>a 且a+c>b ) 则 p=(a+b+c)/2 s= 输出s 否则: 输出 ”三角形边长不正确!”
• 3.直接插入排序 大家都打过扑克牌,通常一边添牌一边排序。 左侧带下划线的就是有序队列,这个思想就是直接插入排 序。
这种排序法和选择排序法的不同之处在于,该算法的重点 是如何将数值放入左侧已排序好的序列中,而不是去考虑 该在右侧序列中挑出哪一个数值。 【例4-6】对数据元素序列v(6)={5,2,4,10,7,3}, 用直接插入法排序。 【解】算法思想如下: 第1轮:首先设该序列中已存在一个有序的子序列(5)。 {(5),2,4,10,7,3} 接下来要将第2个元素2插入到这个子序列中。方法是,从元 素5开始向左找。因为2小于5,因此将2插入到5之前。这 样在原序列中得到一个新的按值有序的子序列(2,5)。 {(2,5),4,10,7,3}
鉴于自然语言语义有歧义,而流程图又太麻烦,人们往往 采用意义精确、唯一且已形式化的类计算机语言——伪代 码来描述。
伪代码兼有自然语言和计算机语言的特点,它结构性较强, 自由、灵活、容易书写和理解,特别是它不拘泥于特定语 言的语法结构,是一种准计算机语言。而根据伪代码写程 序又比较方便,因此用伪代码描述算法目前最为流行。
50
40
60
10
20
70
30
• 【例4-5】对数据元素序列v(6)={8,3,5,2,4,1}, 用冒泡法排序。 【解】算法思想如下: 设想待排序的数组v()垂直竖立,将每个数据元素看作有 重量的气泡,根据轻气泡不能在重气泡之下的原则,从上 往下扫描数组v,凡扫描到违反本原则的轻气泡,就使其 向上“漂浮”,如此反复进行,直至最后任何两个气泡都 是轻者在上,重者在下为止。
• 2.冒泡排序 冒泡排序就是通过序列中相邻元素之间的交换,使较小的 元素逐步从序列的后端移到序列的前端,使较大的元素从 序列的前端移到后端。这就像水底的气泡不断向上“冒” 一样,因此人们形象地称这种排序方法为“冒泡排序”法。 例如:有7个形状大小一样但重量不同的砝码,用冒泡排序 法对他们排序。
总结:包含n个元素的数据序列要进行n-1轮冒泡才能达到有 序的目的。
• • • • •
冒泡排序算法描述如下: 循环(i 从1到n-1) 循环(j 从1 到n-i) 若(v(j) >v(j+1))则 交换 v(j) 和v(j+1)
【分析】
冒泡排序算法中,若有6个待排序数,则第一轮冒泡相邻 元素比较5次,第二轮冒泡比较4次,依此类推,最终需要 比较:5+4+3+2+1=15次,这和选择排序算法的效率一样。 但冒泡排序法数据交换的次数比选择排序要多许多。事实 上,冒泡排序是所有排序算法中效率最低的一个。
2.3排序算法
排序的例子在日常生活中比比皆是,老师喜欢从高分到低 分公布成绩,在上网购书时也发现了排序——畅销图书榜, 按图书销售量排序! 当数据不多时,排序比较简单,有时手工都能做。但若排 序对象是每年几百万高考考生,图书馆几百万册图书,购 书网站上百万个数据,排序就成了一件非常重要且费时的 事情。 近几十年来,人们设计了非常多的排序方法,它们各有特 点,而选择一个合适的方法会大大提高排序效率。 目前常用的排序算法有:选择排序、插入排序、交换排序、 归并排序等。让我们先从简单的入手吧!
最后,算法若用计算机语言来描述即成为程序,程序是算 法在计算机上的特定实现。 算法侧重于问题的解决方法和步骤,程序侧重于机器上的 实现,一个有效的程序首先要有一个有效的算法。因此算 法设计是程序设计的核心。 反过来,针对同一问题,不同的算法所用的时间、空间开 销不同,一个算法的优劣一般用空间复杂度与时间复杂度 来衡量。 例如同样是排序的问题,不同的排序算法各有特点,算法 质量不相同,应用场合也各不相同。
相关文档
最新文档