大学计算与人工智能 课件第3章计算思维与问题求解_第1页
大学计算与人工智能 课件第3章计算思维与问题求解_第2页
大学计算与人工智能 课件第3章计算思维与问题求解_第3页
大学计算与人工智能 课件第3章计算思维与问题求解_第4页
大学计算与人工智能 课件第3章计算思维与问题求解_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大学计算与人工智能(第3章计算思维与问题求解)本章目录3.1计算思维3.2问题求解方法3.3问题描述与程序控制3.4数据结构与算法设计3.5经典算法及其Python实现3.6程序设计与调试

2学习目标(1)理解计算思维的概念和思想,能够使用计算机进行问题求解。(2)掌握问题描述方法,能够利用流程图对问题进行描述。(3)掌握典型的程序控制结构,能够利用分支、循环进行程序设计。(4)理解数据结构的概念和算法设计思想,可以构造问题求解的基本算法。(5)掌握几种经典算法的思想,能够用Python语言实现。(6)掌握程序设计与调试的基本手段。

33.1计算思维2006年,周以真(JeannetteM.Wing)教授在《CommunicationsoftheACM》杂志上提出了计算思维(ComputationalThinking)的概念,并指出:计算思维是指运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。计算思维不仅支持用抽象来控制庞杂的任务,而且支持用分解来实现复杂系统设计。2007年,中国科学院自动化所王飞跃教授翻译了周以真的“计算思维”论文,对“计算思维”进行了分析。王飞跃认为,计算思维不是一个新的名词。在中国,从小学到大学教育,计算思维经常被朦朦胧胧地使用,却一直没有提高到周教授在文章中所描述的高度和广度,以及那样新颖、明确和系统。他认为,计算思维的提出对计算机科学来说可能将产生“涅磐”般的“重生”。

4计算思维不仅是利用计算机相关技术解决领域应用问题的一种思维方法,而且也延伸到了问题求解过程中的问题抽象与建模、自动化求解、反馈与智能优化这一全链过程之中。如图4-1所示。

53.2问题求解方法3.2.1传统的问题求解方法人在人类社会的各个实践领域中,存在着各种各样的矛盾和问题,不断地解决这些问题是人类社会发展的需要。人类解决客观世界问题的思维过程可分成四个阶段:发现问题,分析问题,提出假设,检验假设。

63.2.2计算机的问题求解方法面对客观世界中需要求解的问题时,首先要做的事情就是分析问题,了解问题的特点,明确问题的目的,根据现有的技术和条件(人员、时间、法律和经费等)进行可行性分析,并对问题进行抽象,获取其数学模型。抽象建模是科学研究的重要手段,也是计算机学科里一个非常重要的概念。

71736年,年仅29岁的数学家欧拉来到哥尼斯堡,并发现了当地居民的上述消遣活动。就是试图每座桥恰好走过一遍并回到原出发点,但从来没人成功过。为了解决上述问题,人们最容易想到的方法就是穷举。即把每一种可行的方案使用一遍,但七座桥的所有走法共用7!=5040种,通过人工逐一试验将是很大的工作量。欧拉作为数学家,他首先想到是如何从理论上解决问题。在哥尼斯堡七桥问题抽象后建立的数学模型中,顶点A、B、D度都是3,顶点C的度为5,都为奇数。因此,这个图无法从一个顶点出发,遍历每条边各一次。欧拉的证明与其说是数学证明,还不如说是一个问题抽象的数据建模过程。这个问题的求解开创了数学的一个新的分支,即图论。2.计算机求解问题的过程借助计算机进行问题求解还有其独特的思维方法和求解过程,例如,如何选择数据结构,如何设计求解算法,如何构建高效程序代码等等。因此,可以将计算机求解问题的过程细分为以下步骤:

8(1)问题分析:根据现有的技术和条件(如人员、时间、设备、法律和经费等)对问题进行抽象,获得问题的计算部分,构建数学模型。(2)问题描述:将计算部分划分为确定的输入、处理和输出三个部分。当然,这三个部分并不都是必要的,如有些问题可能没有输入。(3)数据结构:根据问题需求,明确不同数据应该采用的数据类型和数据结构。(4)算法设计:构建问题求解要求,完成问题中的计算部分的核心算法设计与优化。(5)编写程序:选择合适的编程语言,根据问题的数据结构和算法描述,进行程序代码设计。(6)调试测试:对所设计的程序代码进行在线测试和调试,确保程序在各种情况下都能够正确运行。(7)升级维护:根据问题的效率、性能需求变化,优化程序代码,保证程序能够长期正确运行。3.3问题描述与程序控制流程图(FlowChart)是描述我们进行某一项活动所遵循的顺序的一种图示化方法;或者是对某一个问题的定义、分析或解决方法的图形表示。在计算机系统中,流程图是指程序流程图,它用来表示程序中的各种语句的操作顺序。

93.3.3程序控制结构在程序设计语言中,通常将程序按照流程图分成三种基本控制结构:顺序结构、选择结构和循环结构。

10选择结构也称为分支结构,它根据给定的条件判断选择哪一条分支,从而执行相应的程序块(或称语句块)。选择结构包括单分支结构、双分支结构和多分支结构。

顺序结构顾名思义就是按照事情发生的先后顺序依次进行的程序结构,该结构最为简单。当型循环和直到型循环sum=0 #设置初始和为0foriinrange(0,100,2):#从0开始,步长为2,终值为100,100不参与计算

sum+=i #累加0,2,4,6,8,依次类推 print("sum=",sum) #输出求和结果

11循环结构表示程序反复执行某个或某些操作,直到某个条件为假(或为真)时才终止循环。其中,给定的条件称为循环条件,反复执行的程序段称为循环体。因此在循环结构中最主要的是什么情况下需要执行循环。循环结构的基本形式有两种:当型循环和直到型循环。当型循环直到型循环3.4数据结构与算法设计1.数据结构的基本概念数据结构(datastructure)是带有结构特性的数据元素的集合,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。数据结构有很多种,一般来说,按照数据的逻辑结构对其进行简单的分类,包括线性结构和非线性结构两类。线性结构:简单地说,线性结构就是表中各个节点具有线性关系。线性结构有且仅有一个开始节点和一个终端节点,所有节点都最多只有一个直接前趋节点和一个直接后继节点。栈、队列和串等都属于线性结构,也称为线性表。

12非线性结构主要包括数组、树和图等。树是典型的非线性结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。图是一种非线性数据结构。在图的数据结构中,数据节点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。

133.3.2算法设计1.算法的表现形式算法的表现形式有自然语言、流程图、伪代码等。自然语言就是将算法的各个步骤直接写出来。流程图通过特定的图形符号、连接线和文字说明,叙述算法步骤。伪代码通过介于编程语言和自然语言的形式(更类似于编程语言),描述算法步骤。自然语言和伪代码均无特定形式,能够解释清楚意思即可。

14流程图的构建是一个循序渐进的过程,图4-9给出了一个求解a、b、c三个数中最大值的流程构建过程。先简单、再复杂,先模块表示、再不断丰富流程图中的模块内容。因为,流程图的一个流程可以分解为若干个小流程,多个流程也可以合并为一个大流程。

153.5经典算法及其Python实现计算机问题求解中经常采用的经典算法包括:枚举算法、贪心算法、迭代算法(也称递推算法)、递归算法、排序算法等。其他经典算法读者可以通过网络进行学习。3.5.1枚举算法针对前面的哥尼斯堡七桥问题,最容易想到的方法就是枚举了。在计算机时代,由于计算机速度快,像哥尼斯堡七桥问题,由于规模不是很大,很容易通过“枚举算法”来进行求解。那么,什么是枚举算法呢?枚举算法也称之为穷举算法,就是按照问题本身的性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个解是否是该问题的真正解。

161.枚举算法的步骤枚举算法是一种充分利用计算机快速计算能力的求解问题方法。其工作过程可以分为以下两步步。(1)确定枚举对象:枚举对象是枚举算法的关键要素,一般需若干参数来描述。参数越少,枚举空间也越小;参数取值范围越小,搜索空间也越小。(2)列举可能的解并验证:根据枚举对象的参数构造循环,针对每一种可能的取值,根据问题求解目标,验证其是否符合预先规定的逻辑要求,如果满足,则采纳之;否则,抛弃之。

172.枚举算法的实例【实例1】列举给定自然数范围内的所有素数。问题描述:自然数由0开始,用来表示物体个数。素数又称质数,是指大于1的自然数中,除了1和其自身外,不能被其他自然数整除的数。对应较大的自然数,如果使用人工方法进行素数统计,耗时耗力。问题分析:下面以N=1000为例子,使用计算机程序方法,枚举出N之内的所有素数。具体方法为:先构造素数验证函数,然后针对全体枚举对象(1至N的自然数),逐一列举并验证。由于本例相对简单,所以在分析时,可以不用构建流程图。问题求解:在Python语言中,我们用一个for循环构造一个函数isPrime(n)来验证一个数n是否是素数;然后用for循环遍历和验证一个给定的自然数之内的所有数中哪些是素数。具体程序如下。

18defisPrime(n):#验证是否是素数的函数

ifn<=1:return0foriinrange(2,n):ifn%i==0:return0#不是素数

return1#是素数#主函数forninrange(1,1001):#遍历对象1至1000(含)

if(isPrime(n)):#调研函数进行枚举并验证

print(n)#输出素数

193.5.2贪心算法贪心算法(又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,贪心算法的求解是一个多阶段决策的过程,而且每步的决策只需要根据某种“只顾眼前”的贪心策略来执行,并不需要考虑其对子问题的影响。因此,贪心算法的执行效率一般都比较高。但是,在有些情况下,这种“短视”的贪心决策只能导致局部最优,而不是全局最优。

20【实例1】硬币找零问题。问题描述:假设有面值为1.1元,5角和1角的硬币,现在要找给顾客1元5角钱,怎么找使得硬币数目最少?问题分析:为使找回的零钱的硬币数最少,不必求出找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当大面值不足时才去考虑下一个较小面值,这就是贪心算法。问题求解:在不超过应付金额的条件下,选择面值最大的货币,那么得到的找零方案为1个1.1元硬币和4个1角硬币。显然,这不是最优的找零方案,因为3个5角的硬币显然是更优的方案。显然,在上述过程中,每次总是选择面值最大而且不超过应付金额的硬币,并没有考虑这种选择对于后续找零是否合理。这就是一种典型的贪心策略,每次做出局部最优的决策,直至得到问题的一个解。

213.5.3迭代算法迭代算法也称为递推算法,是计算机中的一种简单而常用的算法。其原理是通过已知条件,利用特定关系得出中间结果,再从中间结果不断迭代反复,直到得到最终结果的过程。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,从而方便计算机处理。

22

233.5.4递归算法通过前面的迭代算法来计算阶乘,要计算F(n)必须先计算F(n-1),以此类推,要计算F(1)的值必须得计算F(0)的值。显然,阶乘的计算过程是从F(1)=1*F(0)开始的,然后依次计算F(2)、F(3)至F(n)。如果能够有一种编程方法,直接利用F(n)=n*F(n-1)就能自动计算出结果,将可以大幅度简化程序编程。很幸运,科学家提出了递归算法,可以有效解决这一问题。在递归函数的设计中,必须有递归边界,也就是函数的初值,例如,在阶乘计算中,n=0时的F(0)=1的值就是初值。如果没有初值,递归函数就会无限循环,无法退出。因此,一个递归函数必须包含两部分内容:(1)递归出口:通常是一个决定递归调用何时结束的条件语句,它用来提供递归边界。(2)递归调用:通常是函数内部包含的一个或多个进行自身调用的赋值语句或关系表达式。

24

25【实例3】汉诺塔问题描述:汉诺塔是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。如图4-18所示。

26如果有三个圆盘,模拟其移动过程,可以得到如下移动方案:(1)将圆盘1从towerA移动到towerC(2)将圆盘2从towerA移动到towerB(3)将圆盘1从towerC移动到towerB(4)将圆盘3从towerA移动到towerC(5)将圆盘1从towerB移动到towerA(6)将圆盘2从towerB移动到towerC(7)将圆盘1从towerA移动到towerC总共需要7个步骤才能完成。defmove(dish,A,B,C):if(dish==1):#递归结束条件

print("Moveplate",dish,"fromTower",A,"toTower",C)else:move(dish-1,A,C,B)#递归调用

print("Moveplate",dish,"fromTower",A,"toTower",C)move(dish-1,B,A,C)#递归调用#主函数n=int(input(“请输入需要移动的圆盘数:”))#输入字符串并转换成整数move(n,'A','B','C')#调用函数

273.5.5排序算法所谓排序,就是把一系列无序的数据按照特定的顺序(如升序或降序)重新排列为有序序列的过程。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。排序的方法有很多种,如冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序、基数排序等等。由于蝙蝠限制,本书只介绍其中的几种典型算法,包括冒泡排序、选择排序、插入排序和快速排序,其他算法的原理读者可以通过网络进一步学习。

28冒泡排序(bubblesort)是一种简单直观的排序算法。它重复地扫描要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。这个算法的名字由来是因为越小(增序时)或越大(降序时)的元素会经由交换慢慢"浮"到数列的顶端。作为最简单的排序算法之一,冒泡排序还有一种优化算法,就是设立一个标志flag,当在一趟序列遍历中元素没有发生交换后,则证明该序列已经有序。但这种改进对于提升性能来说作用不太。

29冒泡排序算法主要步骤如下:(1)比较相邻的元素。以升序为例,如果第一个比第二个大,就交换它们两个。对每一对相邻元素作同样的工作,从开始的第一对元素到结尾的最后一对元素。该步完成后,最后的元素会是最大的数。(2)针对所有的元素重复以上步骤,直到没有任何一对数字需要比较为止。冒泡排序算法利用两重循环即可实现。具体的Python程序语言代码如程序所示。

30选择排序(selectionsort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序算法的Python程序语言代码如程序所示。

31插入排序(insertsort)的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够明白。插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序算法的主要步骤如下:(1)将待排序序列中第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。(2)从头到尾依次扫描未排序序列,将扫描到的每个元素按照升序(或降序)插入有序序列的适当位置。如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。

32

33排序算法种类较多,每种算法均有其有缺点。在选择什么排序算法时,主要从三个维度来衡量。一个时间复杂度、一个是空间复杂度、另一个就是算法的稳定性。时间复杂度是指算法需要消耗的时间资源。算法的时间复杂度可记做T(n)=Ο(f(n))。常见的时间复杂度有:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)等。冒泡排序算法、选择排序算法和插入排序算法属于平方阶(O(n2))排序,而快速排序算法算法属于线性对数阶(O(nlog2n))排序。空间复杂度是指算法需要消耗的空间资源。稳定性用来衡量相同数据排序前后一致性。稳定性不是排序考虑的关键指标。3.5.6查找算法查找是在大量的信息中寻找一个特定的信息元素。在计算机应用中,查找是常用的基本运算。下面简单介绍其中最简单的两种:顺序查找和二分查找。顺序查找适合于无序的数列、存储结构为顺序存储或链接存储的线性表。其基本思想为:从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。在顺序查找中,如果表中有两个或以上相同的元素,则只会找出第一个元素。下面是一个顺序查找的Python程序代码:datalist=[4,5,6,8,1,2,4,5,9]#数据列表print(datalist)flag=1value=int(input("输入一个元素:"))foriinrange(len(datalist)):ifdatalist[i]==value:print("这个元素已经找到,是第",i,"个")flag=0breakifflag:print("这个元素没有找到!")

34二分查找也称为折半查找。在二分查找中,所有元素必须是有序的,如果是无序的则要先进行排序操作。 二分查找的基本思想为:用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论