计算机算法设计与分析_第六章__2
算法设计与分析知到章节答案智慧树2023年天津大学

算法设计与分析知到章节测试答案智慧树2023年最新天津大学第一章测试1.下列关于效率的说法正确的是()。
参考答案:提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法;效率主要指处理机时间和存储器容量两个方面;效率是一个性能要求,其目标应该在需求分析时给出2.算法的时间复杂度取决于()。
参考答案:问题的规模;待处理数据的初态3.计算机算法指的是()。
参考答案:解决问题的有限运算序列4.归并排序法的时间复杂度和空间复杂度分别是()。
参考答案:O(nlog2n);O(n)5.将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。
()参考答案:错6.用渐进表示法分析算法复杂度的增长趋势。
()参考答案:对7.算法分析的两个主要方面是时间复杂度和空间复杂度的分析。
()参考答案:对8.某算法所需时间由以下方程表示,求出该算法时间复杂度()。
参考答案:O(nlog2n)9.下列代码的时间复杂度是()。
参考答案:O(log2N)10.下列算法为在数组A[0,...,n-1]中找出最大值和最小值的元素,其平均比较次数为()。
参考答案:3n/2-3/2第二章测试1.可用Master方法求解的递归方程的形式为()。
参考答案:T(n)=aT(n/b)+f(n) , a≥1, b>1, 为整数, f(n)>0.2.参考答案:对3.假定,, 递归方程的解是. ( )参考答案:对4.假设数组A包含n个不同的元素,需要从数组A中找出n/2个元素,要求所找的n/2个元素的中点元素也是数组A的中点元素。
针对该问题的任何算法需要的时间复杂度的下限必为。
( )参考答案:错5.使用Master方法求解递归方程的解为().参考答案:6.考虑包含n个二维坐标点的集合S,其中n为偶数,且所有坐标点中的均不相同。
一条竖直的直线若能把S集合分成左右两部分坐标点个数相同的子集合,则称直线L为集合S的一条分界线。
若给定集合S,则可在时间内找到这条分界线L。
算法设计与分析部分算法伪代码

第三章 蛮力法1.选择排序SelectionSort(A[0..n-1])for i=0 to n-2 domin=ifor j=i+1 to n-1 doif A[j]<A[min]min=jswap A[i] and A[min]2.冒泡排序BubbleSort(A[0..n-1])// 输入:数组A,数组中的元素属于某偏序集// 输出:按升序排列的数组Afor i=0 to n-2 dofor j=0 to n-2-i doif A[j+1]<A[j] swap A[j] and A[j+1]3.改进的冒泡算法ALGORITHM BubbleSortImproved( A[0,…,n –1] )// 冒泡排序算法的改进// 输入:数组A,数组中的元素属于某偏序集// 输出:按升序排列的数组Afor i ← 0 to n – 2 doflag ← Truefor j ← 0 to n – 2 – i doif A[j+1] < A[j]swap(A[j], A[j+1])flag ← False// 如果在某一轮的比较中没有交换,则flag为True,算法结束returnif flag = True4. 顺序查找算法算法 SwquentialSearch2(A[0...n],k)//顺序查找算法的实现,它用了查找键来作限位器//输入:一个n个元素的数组A和一个查找键K//输出:第一个值等于K的元素的位置,如果找不到这样的元素就返回 -1A[n]<--ki<--0while A[i]!=K doi<--i+1if i<n return iElse return -15. 蛮力字符串匹配算法 BruteForceStringMatch(T[0...n-1],P[0...m-1])//该算法实现了蛮力字符串匹配代表一段文本//输入:一个n个字符的数组T[0...n-1]// 一个m个字符的数组P[0..m-1]代表一个模式//输出:如果查找成功的话,返回文本的第一个匹配字串中第一个字符的位置, // 否则返回-1For i<--0 to n-m doj<--0While j<m and P[j]=T[i+j]doj<--i+1If j=m return ireturn -1合并排序最差Θ(nlog2n)快速排序最优Θ(nlog2n)最差Θ(n2)平均Θ(1.38nlog2n)选择排序 Θ(n2)冒泡排序 Θ(n2)插入排序最差Θ(n2)最优 Θ(n)平均 Θ(n2)第四章 分治法合并排序算法 MergeSort(A[0..n-1] )排序 // 递归调用mergesort来对数组 A[0...n-1]// 输入:一个可排序数组A[0..n-1]// 输出:非降序排列的数组A[0..n-1]if n > 1n/2 -1]copy A[0.. n/2 -1] to B[0..n/2 -1]copy A[ n/2 ..n-1] to C[0..MergeSort( B )MergeSort( C )Merge( B,C,A )两个数组合并的算法算法 Merge(B[0..p-1],C[0..q-1],A[0..p+q-1])//将两个有序数组合并成一个有序的数组和C[0...q-1]//输入:两个有序数组B[0...p-1]//输出:A[0..p+q-1]中已经有序存放了B和C中的元素 i=0,j=0,k=0;while i<p and j<q do≤C[j]if B[i]A[k]=B[i], i=i+1elseA[k]=C[j], j=j+1k=k+1if i=pcopy C[j..q-1] to A[k..p+q-1]elsecopy B[i..p-1] to A[0..p+q-1]快速排序算法QuickSort(A[l..r])// 使用快速排序法对序列或者子序列排序或者序列本身A[0..n-1]// 输入:子序列A[l..r]// 输出:非递减序列Aif l < rs ← Partition( A[l..r] )QuickSort( A[l..s-1] )QuickSort( A[s+1..r] )//s是中轴元素/基准点,是数组分区位置的标志实现分区的算法Partition( A[l..r] )// 输入:子数组A[l..r]// 输出:分裂点/基准点pivot的位置p ← A[l]i ← l; j ← r+1repeat≥ prepeat i ←i + 1until A[i]≤ prepeat j ← j – 1 until A[j]swap( A[i], A[j] )≥ juntil iswap( A[i], A[j] )swap( A[l], A[j] )return j折半查找BinarySearch( A[0..n-1], k )// 输入:已排序大小为n的序列A,待搜索对象k// 输出:如果搜索成功,则返回k的位置,否则返回-1 l=0,r=n-1;While l≤rmid= (l+r)/2if k = A[mid] return midelse if k < A[mid] r=m-1else l=m+1return -1Strassen矩阵Strassen方法M1=A11(B12-B22)M2=(A11+A12)B22M3=(A21+A22)B11M4=A22(B21-B11)M5=(A11+A22)(B11+B22)M6=(A12-A22)(B21+B22)M7=(A11-A21)(B11+B12)第五章 减治法插入排序ALGORITHM InsertionSort( A[0..n-1] )// 对给定序列进行直接插入排序// 输入:大小为n的无序序列A// 输出:按非递减排列的序列Afor i ← 1 to n-1 dotemp ← A[i]j ← i-1while j ≥ 0 and A[j] > temp doA[j+1] ← A[j]j ← j –1A[j+1] ←temp深度优先查找算法 BFS(G)//实现给定图的深度优先查找遍历//输入:图G=<V,E>//输出:图G的顶点,按照被DFS遍历第一次访问到的先后次序,用连续的整数标记,将V中的每个顶点标记为0,表示还“未访问”count =0//记录这是第几个访问的节点标记为 unvisitedmark each vertex with 0//∈ V dofor each vertex vif v is marked with 0dfs(v)dfs(v)//递归访问所有和v相连接的未访问顶点,然后按照全局变量count的值//根据遇到它们的先后顺序,给它们附上相应的数字count = count + 1mark v with countv dofor each vertexw adjacent toif w is marked with 0dfs(w)广度优先BFS(G)/实现给定图的深度优先查找遍历//输入:图G=<V,E>//输出:图G的顶点,按照被BFS遍历第一次访问到的先后次序,用连续的整数标记,将V中的每个顶点标记为0,表示还“未访问”count =0mark each vertex with 0for each vertex v∈ V dobfs(v)bfs(v)//递归访问所有和v相连接的未访问顶点,然后按照全局变量count的值//根据遇到它们的先后顺序,给它们附上相应的数字count = count + 1mark v with countinitialize queue with vwhile queue is not empty doa = front of queuefor each vertex w adjacent to a doif w is marked with 0count = count + 1mark w with countadd w to the end of the queueremove a from the front of the queue拓扑排序第六章 变治法Gauss消去法GaussElimination(A[1..n], b[1..n])// 输入:系数矩阵A及常数项 b// 输出:方程组的增广矩阵等价的上三角矩阵for i=1 to n doA[i][n+1] =b[i]for j= i+1 to n dofor k = i to n+1 do– A[i][k]*A[j][i]/A[i][i]A[j][k] = A[j][k]堆排序堆排序主要包括两个步骤:对于给定的数组构造相应的堆。
算法设计与分析课件

ACM国际大学生程序设计竞赛
ACM国际大学生程序设计竞赛(英文 全称:ACM International Collegiate Programming Contest(ACM-ICPC或 ICPC)是由美国计算机协会(ACM)主办 的,一项旨在展示大学生创新能力、团队 精神和在压力下编写程序、分析和解决问 题能力的年度竞赛。经过30多年的发展, ACM国际大学生程序设计竞赛已经发展成 为最具影响力的大学生计算机竞赛。赛事 目前由IBM公司赞助。
主要内容介绍(续)
• • • • 第 7章 第 8章 第 9章 第10章 概率算法 NP完全性理论 近似算法 算法优化策略
1
相关先导基础课程和算法概述
专业基础课程: 数据结构、计算机语言(C++)、操作系统 如何编写计算机程序: • 数据结构+算法 = 程序 • 算法:计算机软件的“灵魂” 算法是计算机科学和计算机应用的核心
1.2 算法复杂性分析
Ω的定义:如果存在正的常数C和自然数N0,使得当NN0时 有f(N)Cg(N),则称函数f(N)当N充分大时下有界,且g(N)是它 的一个下界,记为f(N)=Ω (g(N))。即f(N)的阶不低于g(N)的阶。 θ的定义:定义f(N)= θ (g(N))当且仅当f(N)=O(g(N))且 f(N)= Ω (g(N))。此时称f(N)与g(N)同阶。 o的定义:对于任意给定的ε>0,都存在正整数N0,使得 当NN0时有f(N)/Cg(N)ε,则称函数f(N)当N充分大时的阶比 g(N)低,记为f(N)=o(g(N))。 例如,4NlogN+7=o(3N2+4NlogN+7)。
调试:“调试只能指出有错误,而不能指出它们不存在 错误” 9 作时空分布图:验证分析结论,优化算法设计
(陈慧南 第3版)算法设计与分析——第6章课后习题答案

⑥ 选择作业 1,则 X 6, 2,3,5,1 。将其按照期限 di 非减次序排列可
得:
ID
di
5
1
6
2
3
3
1
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业6 作业1(冲突)
该集合无可行排序,因此 X 6, 2,3,5,1 不可行, X 6, 2,3,5 ;
3
⑦ 选择作业 0,则 X 6, 2,3,5, 0 。将其按照期限 di 非减次序排列
可得:
ID
di
5
1
0
1
6
2
3
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业0(冲突)作业6
该集合无可行排序,因此 X 6, 2,3,5, 0 不可行,X 6, 2,3,5 ;
⑧ 选择作业 4,则 X 6, 2,3,5, 4 。将其按照期限 di 非减次序排列
可得:
ID
Hale Waihona Puke di516
12,5,8,32, 7,5,18, 26, 4,3,11,10, 6 。请给出最优存储方案。
解析:首先将这 13 个程序按照程序长度非降序排列,得:
程序 ID
9 8 1 5 12 4 2 11 10 0 6 7 3
程序长度 ai 3 4 5 5 6 7 8 10 11 12 18 26 32
根据定理可知,按照程序编号存放方案如下:
解析:已知 Prim 算法时间复杂度为 O n2 ,受顶点 n 影响;
Kruskal 算法时间复杂度为 O m logm ,受边数 m 影响;
算法设计与分析_王红梅_课后答案网(部分)

第六章动态规划法• P137 2 ,3, 4•2.解答:cost[i]表示从顶点i 到终点n-1 的最短路径,path[i]表示从顶点i 到终点n-1 的路径上顶点i 的下一个顶点。
cost[i]=min{cij+cost[j]}3 有5 个物品,其重量分别是{3, 2, 1, 4,5},价值分别为{25, 20, 15, 40, 50},背包的容量为6。
V[i][j]表示把前i 个物品装入容量为j 的背包中获得的最大价值。
最优解为(0,0,1,0,1)最优值为65. 4.序列A =(x, z , y , z , z , y,x ),B =(z , x , y , y , z , x , z ),建立两个(m+1)×(n+1)的二 维表L 和表S ,分别存放搜索过程中得到的子序列的长度和状态。
z , x , y , y , z,x , z )path[i]= 使 cij+cost[j] 最小的 j i 012345678 9 10 11 12 13 14 15 Cost[i] 18 13 16 13 10 9 12 7 6875943Path[i]145778911 11 11 13 14 14 15 15 0得到最短路径 0->1->4->7->11->14->15 , 长度为 18(a)长度矩阵L(b)状态矩阵S 。
第七章贪心算法2.背包问题:有7 个物品,背包容量W=15。
将给定物品按单位重量价值从大到小排序,结果如下:个物品,物品重量存放在数组w[n]中,价值存放在数组放在数组x[n]中。
按算法7.6——背包问题1.改变数组w 和v 的排列顺序,使其按单位重量价值v[i]/w[i]降序排列;2.将数组x[n]初始化为0;//初始化解向量3.i=1;4.循环直到( w[i]>C )4.1 x[i]=1; //将第i个物品放入背包4.2 C=C-w[i];4.3 i++;5. x[i]=C/w[i];得出,该背包问题的求解过程为:: x[1]=1;c=15-1=14 v=6 x[2]=1; c=14-2=12V=6+10=10 x[3]=1; c=12-4=8V=16+18=34 x[4]=1; c=8-5=3V=34+15=49 x[5]=1; c=3-1=2 V=49+3=52x[6]=2/3 ; c=0; V=52+5*2/3=156/3 最优值为156/3 最优解为(1,1,1,1,1,2/3,0)) (x[i]按排序后物品的顺序构造)5.可以将该问题抽象为图的着色问题,活动抽象为顶点,不相容的活动用边相连(也可以将该问题理解为最大相容子集问题,重复查找剩余活动的最大相容子集,子集个数为所求).具体参见算法7.3 算法7.3——图着色问题1.color[1]=1; //顶点1着颜色12.for (i=2; i<=n; i++) //其他所有顶点置未着色状态color[i]=0;3.k=0;4.循环直到所有顶点均着色4.1k++; //取下一个颜色4.2for (i=2; i<=n; i++) //用颜色k 为尽量多的顶点着色4.2.1 若顶点i已着色,则转步骤4.2,考虑下一个顶点;4.2.2 若图中与顶点i邻接的顶点着色与顶点i着颜色k 不冲突,则color[i]=k;5.输出k;第八章回溯法4.搜索空间(a) 一个无向图(b) 回溯法搜索空间最优解为(1,2,1,2,3)5.0-1 背包问题n∑w i x i≤c 1• 可行性约束函数:i =1• 上界函数:nr =∑Vi5 = 3A B *CD8 ** * 131 =12 =23 = 14 = 2 34215课后答案网()i=k+1 1第九章分支限界法5,解:应用贪心法求得近似解:(1,4,2,3),其路径代价为:3+5+7+6=21,这可以作为该问题的上界。
第6章 计算与算法理论

(2)流程图 流程图是一种用于表示算法或过程的图形。在流程图中 ,使用各种符号表示算法或过程的每一个步骤,使用箭头符 号将这些步骤按照顺序连接起来。使用流程图表示算法可以 避免自然语言的模糊缺陷,且依然独立于任何一种特殊的程 序设计语言。流程图的使用人员包括分析人员、设计人员、 管理人员、工程师和编程人员等。
在一般流程图中,主要的图形元素如下: ① 开始/结束框。一般使用圆形、椭圆形或圆角矩形表示, 用于明确表示流程图的开始和结束。 ② 箭线。带有箭头的线段,表示算法控制语句的流向。一 般地,箭线源自流程图中的某个图形,在另一个图形处终止 ,从而描述算法的执行过程。 ③ 处理框。在一般流程图中,往往使用直角矩形表示算法 的处理步骤,称为处理框。 ④ 输入/输出框。一般情况下,流程图使用平行四边形来表 示输入/输出框,也就是表示算法的输入、输出操作。 ⑤ 条件判断框。许多流程图使用菱形表示条件判断框,用 于执行算法中的条件判断,控制算法的执行过程,在条件判 断框中,往往有一个输入箭线和两个输出箭线,两个输出箭 线分别表示条件成立时和不成立时的执行顺序。
图灵机对现代计算机的出现和发展有很大作用,有不少启示。对 图灵机给出如此高的评价,因为其中蕴涵着很深邃的思想。 ① 图灵机,向我们展示了这样一个过程:程序和其输入数据 保存到存储带上,图灵机程序一步一步运行直到给出结果,结果 也保存在存储带上,程序在控制器中。 ② 可以隐约看到现代计算机的主要构成:存储器(相当于存 储带)、中央处理器(相当于控制器及其状态,并且其字母表可 以仅有0和1两个符号)、IO系统(相当于存储带的预先输入)。 ③ 基本动作非常简单、机械、确定。左/右移、不移;读/写 带;确定指令;获取机器状态、改变机器状态。因此有条件用真 正的机器来实现图灵机。
计算机算法设计与分析

计算机算法设计与分析计算机算法设计与分析在计算机科学领域扮演着重要的角色。
它是研究和开发高效算法的过程,以解决各种计算问题。
在本文中,我们将探讨算法设计与分析的基本原理、常见算法类型以及算法分析的重要性。
一、算法设计与分析的基本原理算法设计的目标是开发一种能够解决特定问题的步骤序列。
这些步骤应该是明确的、非歧义的,并且能够在有限的时间内产生预期的结果。
为了实现这一目标,算法设计需要考虑以下几个主要原理:1. 问题抽象:将实际问题转化为计算机能够理解和处理的抽象形式。
这涉及到定义输入和输出,以及建立问题的数学模型。
2. 分解与合成:将复杂问题分解为更简单的子问题,然后将子问题的解合并成原始问题的解。
这种分解与合成的过程可以提高算法的可读性和效率。
3. 数据结构选择:选择适当的数据结构来存储和操作问题的输入和输出。
不同的数据结构对于不同的问题具有不同的性能和效率。
4. 控制结构设计:设计算法控制结构,如循环、条件语句和递归等,以实现预期的计算过程。
二、常见的算法类型在算法设计与分析中,有各种各样的算法类型可供选择。
以下是一些常见的算法类型:1. 排序算法:排序算法用于按照一定的规则对数据进行排序。
常见的排序算法包括冒泡排序、插入排序、选择排序、归并排序和快速排序等。
2. 搜索算法:搜索算法用于查找指定数据的位置或者判断数据是否存在。
常见的搜索算法包括线性搜索、二分搜索和哈希搜索等。
3. 图算法:图算法用于处理图数据结构上的问题。
常见的图算法包括最短路径算法、最小生成树算法和拓扑排序算法等。
4. 动态规划算法:动态规划算法用于解决一些最优化问题,它通过将问题分解为子问题,并利用已解决的子问题的解来解决原始问题。
三、算法分析的重要性算法分析是评估算法性能和效率的过程,它对于算法设计与分析至关重要。
通过对算法进行分析,我们可以了解算法的时间复杂度、空间复杂度和性能边界等关键指标。
这些指标可以帮助我们选择最适合特定问题的算法,并预测算法在不同输入情况下的表现。
《计算机算法设计与分析》课程设计

用分治法解决快速排序问题及用回溯法解决0-1背包问题一、课程设计目的:《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。
通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。
二、课程设计内容:1、分治法:(2)快速排序;2、回溯法:(2)图的着色。
三、概要设计:●分治法—快速排序:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
分治法的条件:(1) 该问题的规模缩小到一定的程度就可以容易地解决;(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3) 利用该问题分解出的子问题的解可以合并为该问题的解;(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
抽象的讲,分治法有两个重要步骤:(1)将问题拆开;(2)将答案合并;●回溯法—0-1背包问题回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始节点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的或节点,并成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向移动,则当前的扩展结点就成为死结点。
换句话说,这个节点,这个结点不再是一个活结点。
此时,应往回(回溯)移动至最近一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法即以这种工作方式递归的在解空间中搜索,直到找到所要求的解或解空间中以无活结点为止。
四、详细设计与实现:分治法—快速排序快速排序是基于分治策略的另一个排序算法。
其基本思想是,对于输入的子数组[]r p a :,按以下三个步骤进行排序:(1)、分解(divide) 以元素[]p a 为基准元素将[]r p a :划分为三段[]1:-q p a ,[]q a 和,[]r q a :1+使得[]1:-q p a 中任何一个元素都小于[]q a ,而[]r q a :1+中任何一个元素大于等于[]q a ,下标q 在划分过程中确定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
16
procedure SUMOFSUB(s,k,r)
//找W(1:n)中和数为M的所有子集。进入此过程时X(1),…,X(k-1)的值已确定。W(j) 按非降次序排列。//
1 global integer M,n; global real W(1:n); global boolean X(1:n) 2 real r, s; integer k,j //生成左儿子// 3 X(k)1 4 if s+W(k)=M then 5 print(X(j),j1 to k) 6 else 7 if s+W(k)+W(k+1) ≤ M then 8 call SUMOFSUB(s+W(k),k+1,r-W(k)) 9 endif 10 endif 11 if s+r-W(k) ≥ M and s+W(k+1) ≤ M then 12 X(k)0 13 call SUMOFSUB(s,k+1,r-W(k)) 14 endif end SUMOFSUB
8-皇后问题
检测放置新皇后的算法
procedure PLACE(k)
//如果一个皇后可以放在第k行和X(k)列,则返回true;否则返回false//
global X(1:k); integer i ,k i←1 while i<k do if X(i) = X(k)//在同一列有两个皇后 or ABS(X(i)-X(k)) = ABS(i-k)//在同一条斜角线上 then return (false) PLACE(k): i←i+1 令X(k)与X(i)逐个比较,i=1..k-1。 repeat 若存在X(k)=X(i)或者|X(i)-X(k)|=|i-k| return (true) 则返回false; End PLACE
23
图的着色
问题描述
– 将地图转换为图
4
5
1 2 3
3
2 1
5 图6.10 一幅地图和他的平面图表示
4
24
图的着色
解空间构建
– 颜色数用1, 2, …, m来表示 – 采用n-元组(x(1), …, x(n))表示图G的m-着色判定问题 的解,x(i)是结点i的颜色 – 采用邻接矩阵表示无向图G=(V, E) 。
10
8-皇后问题
算法分析
– NQUEENS优于硬性处理 硬性处理:要求8×8的棋盘排出8块位置,有〔88〕 种可能的方式。即要检查将近4.4×109个8-元组。 NQUEENS回溯法:只允许把皇后放置在不同的 行和列上,至多需要作8!次检查,即至多只检查 40320个8-元组。
11
8-皇后问题
限界函数
– 任何相邻的两个结点都具有不同的颜色:如果边(i, j)∈E, i≠j, 则x(i) ≠ x(j) – 将合法的颜色分配给x(i)
25
图的着色
状态空间树
X(1)=1 X(1)=2 X(1)=3
X(2)=1
X(2)=3 X(2)=2
X(3)=1 X(3)=3
X(3)=2
26
图的着色
15,5,33
x(5)=1
B (1,0,1,1)
5,5,33
10,5,33
12,5,33
13,5,33
0,5,33
12,6,18 (0,0,1,0,0,1)
A (1,1,0,0,1) C
19
第六章 回溯法
6.1 一般方法 6.2 8-皇后问题 6.3 子集和数问题 6.4 图的着色 6.5 0/1背包问题
第六章 回溯法
6.1 一般方法 6.2 8-皇后问题 6.3 子集和数问题 6.4 图的着色 6.5 0/1背包问题
14
子集和数问题
问题描述
– 已知n个不同的正数(w1, w2, …, wn)。要求找出wi的和 数等于某个正数M的所有子集。 – 元组为大小固定,n元组(x1,x2,…,xn),xi=1或0 – 结点:对于i级上的一个结点,其左儿子对应于xi=1, 右儿子对应于xi=0
//生成右儿子和计算Bk的值//
子集和数问题
实例
– 设有n=6个正数的集合W={5,10,12,13,15,18}和整数 M=30,求W的所有元素之和为M的子集。 – 求解见下图 – 方形结点:s,k,r,圆形结点:输出答案的结点, 共生成20个结点
18
0,1,73
x(1)=1 x(1)=0
5
8-皇后问题
测试两个皇后在一条斜角线的方法 – 令(x1,…,xn)表有两个皇后可以放入同一列,因 此这所有的Xi将是截然不同。 – 如果设想棋盘的方格像二位数组A(1:n, 1:n)的下标那 样标记,那么可以看到, 对于在同一条斜角线上的由左上方到右下方的每 一个元素有相同的“行-列”值, 在同一条斜角线上的由右上方到左下方的每一个 元素则有相同的“行+列”值。
第六章 回溯法
1
2014-11-10
第六章 回溯法
6.1 一般方法 6.2 8-皇后问题 6.3 子集和数问题 6.4 图的着色 6.5 0/1背包问题
2
8-皇后问题
问题描述
– 将n个皇后放置在一个n×n的棋盘上,要求没有两个 皇后可以互相攻击。 – 攻击的定义: 两个皇后出现在同一行、或同一列、或者同一条 斜线上都视为出现了攻击。
9
否则返回true。
过程NQUEENS求n-皇后问题的所有解
procedure NQUEENS(n) integer k, n, X(1:n) X(1) ← 0; k ← 1 //K是当前行;X(k)是当前列 while k>0 do //对所有的行执行一下语句 X(k) ←X(k)+1 //移到下一列 while X(k) ≤ n and not PLACE(k) do //此处能放这个皇后吗 X(k) ←X(k)+1 repeat if X(k) ≤ n then //找到一个位置 if k=n then //是一个完整的解吗 print (X) //是,打印这个数组 else k ← k+1 , X(k) ← 0 //转到下一行 endif else k ← k-1 //回溯 endif repeat End NQUEENS
22
图的着色
问题描述
– 地图的着色问题: 1976年爱普尔(K.L. Apple),黑肯(W. Haken)和考 西(J. Koch)利用电子计算机证明了4种颜色足以对 任何地图着色。 – 四色定理 每幅地图都可以用不多于4种颜色来着色,使得有 共同边界的国家着不同的颜色。 – 平面图的4-着色判定问题 一幅地图很容易用一个平面图G表示。(将地图的 每个区域用图G的一个结点表示,若两个区域相邻, 则相应的两个结点用一条边连接起来。)
28
图的着色
算法说明
– 在最初调用call MCOLORING(1)之前,应对图的邻 接矩阵置初值并对数组X置0值。 – 在确定了X(1)到X(k-1)的颜色之后,过程 NEXTVALUE从这m种颜色中挑选一种符合要求的颜 色,并把它分配给X(k),若无可用的颜色,则返回 X(k)=0。
29
算法6.8 生成下一种颜色 Procedure NEXTVALUE(k) //进入此过程前X(1),…,X(k-1)已分得了区域[1,m]中的整数且相邻近的结点有 不同的整数。本过程在区域[0,m]中给X(k)确定一个值;如果还剩下一些颜色, 他们与结点k邻接的结点分配的颜色不同,就将其中最高标准的颜色分配给结 点k;如果没有剩下可用的颜色,则置X(k)为0// global integer m, n, X(1:n); boolean GRAPH(1:n, 1:n); integer j, k loop X(k) (X(k)+1) mod (m+1) //试验下一个最高标准值的颜色// if X(k)=0 then return endif //全部颜色用完// for j 1 to n do //检查此颜色是否与邻近结点的那些颜色不同// if GRAPH(k, j) and //如果(k,j)是一条边// X(k)=X(j) //并且邻近的结点有相同颜色// then exit endif repeat if j=n+1 then return endif //找到一种颜色// repeat //否则试着找另一种颜色// end NEXTVALUE
W={5,10,12,13,15,18} M=30,
0,2,68
5,2,68
x(2)=1
x(2)=0
15,3,58
x(3)=0
5,3,58
x(3)=1 x(3)=0
10,3,58
5,4,46 10,4,46
0,3,58
12,4,46 0,4,46
15,4,46
x(4)=0
17,4,46
x(4)=1
x(4)=0
3
8-皇后问题的一个解
1 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8
该解的8元组 表示: (4,6,8,2,7,1,3,5)
8-皇后问题
用n-元组(x1,x2,…,xn)表示棋盘上皇后的位置状态 – 下标表示皇后i (i=1,2,…,n) – xi表示放置皇后i所在的列号 显式约束条件: – 每个xi只从集合Si={1,2,…,n}取值 – 满足显式约束的所有元组确定一个可能的解空间 解空间由nn个n-元组组成 隐式约束条件 – 没有两个xi可以相同,而且没有两个皇后可以在同一 条斜线上 由前者得,所有解都是n-元组(1,2,…,n) 的置换,因此,解空间缩小为 n!个元组
算法分析
– 估算节点数(蒙特卡罗方法): 假设使用固定的限界函数且在检索进行时函数不 改变。 在状态空间树的同一级的所有节点都有相同的度。 静态的状态空间树节点个数为: 1+8+8*7+8*7*6+…+8*7*6*5*4*3*2*1 7 7 j =1+∑8*..*(8-j)=1+ ∑ ∏(8-i)=69281 j=0 j=0 i=0