西电软件学院算法实验报告

合集下载

西电软院西电软院计组上机报告下

西电软院西电软院计组上机报告下
四、实验过程
1、导入工程 DM2_KX8051,编绎工程。设计原理图如图 7.3 所示。
2、连接下载 JTAG 口,进行下载,点击工具条上的 图标,进行下载。点 Hardware Setup 选择下载器,只勾上 program/configure,其 它不选,选 start 进行下载,如图 7.4 所示。
实验二 键盘扫描,中断实验 一、实验题目
键盘扫描,中断实验。
二、实验环境
Windows 操作系统,Quartus II,FPGA 开发板。
三、实验内容
本实验主要进行对 4*4 键盘原理分析,实现对键盘扫描码的判断。分别利用查询及 中断方式进行扫描键盘。
四、实验过程
1、导入工程 DM2_KX8051,编绎工程。设计原理图如图 7.3 所示。
4、打开 Quartus II 中工具下的系统内存数据编缉器。操作如图 7.5 所示。
5、点击窗口右侧的 setup 进行 JTAG 口查找,查找后能找到一个 RAM,一个 ROM。 6、ROM内的数据既为程序的目标代码,右击ROM选import data from file 选择生成 的.hex目标文件,将文件写入开发板。
图 6.8 打开系统内存数据编缉器 6、点击窗口右侧的 setup 进行 JTAG 口查找,查找后能找到一个 RAM,一个 ROM。 7、 ROM 内的数据既为程序的目标代码,右击 ROM 选 import data from file 选择生 成的.hex 目标文件,如图 6.9 所示,按复位键运行程序。
图 7.3 设计原理图 2、连接下载 JTAG 口,进行下载,点击工具条上的 图标,进行下载。点 Hardware Setup 选择下载器,只勾上 program/configure,其 它不选,选 start 进行下载,如图 7.4 所示。

算法设计与分析实验报告三篇

算法设计与分析实验报告三篇

算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。

2、掌握算法渐近复杂性的数学表述。

3、掌握用C++语言描述算法的方法。

4.实现具体的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。

书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。

例如,第6 页用数字6 表示,而不是06 或006 等。

数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。

编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。

把这些结果统计起来即可。

四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}五.程序调试中的问题调试过程,页码出现报错。

软件算法展示实验报告(3篇)

软件算法展示实验报告(3篇)

第1篇一、实验目的1. 理解并掌握软件算法的基本概念和原理。

2. 掌握常见软件算法的设计与实现方法。

3. 通过实验,提高算法分析、设计、实现和优化能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本次实验主要展示了以下软件算法:1. 冒泡排序2. 快速排序3. 二分查找4. 线性查找5. 简单链表操作6. 二叉树遍历四、实验步骤1. 冒泡排序(1)编写冒泡排序算法的代码实现。

(2)测试代码,验证算法的正确性。

2. 快速排序(1)编写快速排序算法的代码实现。

(2)测试代码,验证算法的正确性。

3. 二分查找(1)编写二分查找算法的代码实现。

(2)测试代码,验证算法的正确性。

4. 线性查找(1)编写线性查找算法的代码实现。

(2)测试代码,验证算法的正确性。

5. 简单链表操作(1)实现链表的创建、插入、删除和遍历等基本操作。

(2)测试代码,验证链表操作的正确性。

6. 二叉树遍历(1)实现二叉树的创建、插入、遍历等基本操作。

(2)测试代码,验证二叉树遍历的正确性。

五、实验结果与分析1. 冒泡排序实验结果:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]测试代码arr = [64, 34, 25, 12, 22, 11, 90]bubble_sort(arr)print("Sorted array is:", arr)```分析:冒泡排序算法是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将待排序的序列逐步变成有序序列。

实验结果显示,冒泡排序算法能正确地将输入数组排序。

西安电子科技大学算法上机报告

西安电子科技大学算法上机报告

西安电子科技大学(2018年度)算法分析实验报告实验名称:渗透实验班级:1603012*名:**学号:***********实验一:渗透问题(Percolation)一、实验题目使用合并-查找(union-find)数据结构,编写程序通过蒙特卡罗模拟(Monte Carlo simulation)来估计渗透阈值的值。

给定由随机分布的绝缘材料和金属材料构成的组合系统:金属材料占多大比例才能使组合系统成为电导体?给定一个表面有水的多孔渗水地形(或下面有油),水将在什么条件下能够通过底部排出(或油渗透到表面)?科学家们已经定义了一个称为渗透(percolation)的抽象过程来模拟这种情况。

模型:我们使用N×N网格点来模型一个渗透系统。

每个格点或是open格点或是blocked格点。

一个full site是一个open格点,它可以通过一连串的邻近(左,右,上,下)open格点连通到顶行的一个open格点。

如果在底行中有一个full site格点,则称系统是渗透的。

(对于绝缘/金属材料的例子,open格点对应于金属材料,渗透系统有一条从顶行到底行的金属路径,且full sites格点导电。

对于多孔物质示例,open格点对应于空格,水可能流过,从而渗透系统使水充满open格点,自顶向下流动。

)问题:在一个著名的科学问题中,研究人员对以下问题感兴趣:如果将格点以空置概率p 独立地设置为open格点(因此以概率1-p被设置为blocked格点),系统渗透的概率是多少?当p = 0时,系统不会渗出; 当p=1时,系统渗透。

下图显示了20×20随机网格和100×100随机网格的格点空置概率p与渗滤概率。

当N足够大时,存在阈值p*,使得当p <p*,随机N⨯N网格几乎不会渗透,并且当p> p*时,随机N⨯N网格几乎总是渗透。

尚未得出用于确定渗滤阈值p*的数学解。

你的任务是编写一个计算机程序来估计p*。

西电软院网络多媒体上机报告讲解

西电软院网络多媒体上机报告讲解

网络多媒体上机实验报告目录实验一哈夫曼编码实验二算术编码实验三LZW编码实验四WAV文件的读取附录对应的四个源程序 实验一哈夫曼编码算法分析:哈夫曼编码采用自底向上的描述方式。

哈夫曼编码运用了贪心算法,每次都取权值最小的两个节点合并成一个节点,该合并节点的权值记为两者权值之和,然后继续上述操作直到最后合并成一个节点,在建成树的过程中,就记下了相应的哈夫曼编码。

通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent为树的顶点为止。

每个频率都会有一个01编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。

程序设计:构造最优二叉树:输入入N个叶子节点的权值,找出所有结点中权值最小、无父结点的两个结点,并合并成一个结点,继续在剩下的结点中寻找权值最小的叶子结点,循环合并结点操作,并最终生成最优二叉树,节点在二叉树的深度的编码既是对此组字符的哈夫曼编码。

我们将用自己定义的结构体来表示各个节点,其中结构体中包含权值,左右孩子和父节点,然后用一个select函数来寻找当前最小的两个节点,合并成一个节点,然后继续直到全部合并为一个节点,然后顺着树来将其01编码储存在一个一个字符数组中。

调试过程:由于之前做过哈夫曼编码问题。

因此问题不大,未遇到较难处理的问题。

运行结果:这是实验的截图,从中可以看出,权值比较大的用到的编码的位数比较少,而权值较小的节点则远离根节点。

而且,我们可以从上图看出哈弗曼是一种前缀编码。

实验二算术编码算法分析:算数编码是一种更现代的编码方法,算术编码把整个消息看做一个单元。

在实际的应用中,输入数据同城被分割成块以避免错误传播。

他只传输一个区间的值,从而可以通过迭代得知相应的信息,性能比较好。

程序设计:我们将整个信息的概率设置为1,各个信号的概率给出,则一个字符一个字符的取,当取到某个自腐蚀,则将其限制在{low,high}之间,然后在在这个区间内继续往下细分,不断迭代,最后生成一个数,我们可以寻找在最后区间内的一个最短的二进制码字,记得到编码,解码同样是不断的看在那个范围中。

2021年西安电子科技大学计组实验报告

2021年西安电子科技大学计组实验报告

西安电子科技大学计算机组织与体系结构 课程试验汇报试验名称 计算机组织与体系结构计算机 学院 1503013 班姓名 陈宁 学号 同作者 罗超试验日期 年 9 月 24 日试验地点 E-II-311 试验批次 第二批一.试验目1.深入了解基础模型计算机功效、组成知识;2.深入学习计算机各类经典指令实施步骤;3.学习微程序控制器设计过程和相关技术, 掌握LPM_ROM配置方法。

4.在掌握部件单元电路试验基础上, 深入将单元电路组成系统, 结构一台基础模型计算机。

5.定义五条机器指令, 并编写对应微程序, 上机调试, 掌握计算机整机概念。

掌握微程序设计方法, 学会编写二进制微指令代码表。

6.经过熟悉较完整计算机设计, 全方面了解并掌握微程序控制方法计算机设计方法。

二.试验原理1.在部件试验过程中, 各部件单元控制信号是人为模拟产生, 而本试验将能在微过程控制下自动产生各部件单元控制信号, 实现特定功效。

试验中, 计算机数据通路控制将由微过程控制器来完成, CPU 从内存中取出一条机器指令到指令实施结束一个指令周期, 全部由微指令组成序列来完成, 即一条机器指令对应一个微程序。

2.指令格式 (1)指令格式采取寄存器直接寻址方法, 其格式以下:其中, OP -CODE 为操作码, rs 为源寄存器, rd 为目寄存器, 并要求:1,存放器读操作(KRD): 下载试验程序后按总清除按键(CLR)后, 控制台SWA、SWB为“0 0”时, 可对RAM连续手动读入操作。

2,存放器写操作(KWE): 下载试验程序后按总清除按键(CLR)后, 控制台SWA、SWB为“0 1”时, 可对RAM连续手动写操作。

3、开启程序(RP): 下载试验程图6-1 数据通路框图序后按总清除按键(CLR)后, 控制台SWA、SWB为“1 1”时, 即可转入到微地址“01”号“取指令”微指令, 开启程序运行。

依据以上要求设计数据通路框图, 如图5-1所表示。

西安邮电大学java类与对象实验报告

西安邮电大学java类与对象实验报告

西安邮电⼤学java类与对象实验报告西安邮电⼤学(计算机学院)Java程序设计课内实验报告实验名称:类与对象专业名称:软件⼯程班级:学⽣姓名:学号(8位):指导教师:实验⽇期:2014年4⽉2⽇⼀. 实验⽬的及实验环境理解类与对象的概念,掌握Java 类的定义(域、⽅法)、创建对象和使⽤对象。

理解包的概念,会创建包,引⼊包。

掌握访问权限规则。

环境:eclipse⼆. 实验内容1. 设计Point 类⽤来定义平⾯上的⼀个点,⽤构造⽅法传递坐标位置。

默认构造⽅法创建坐标原点,带参数构造⽅法根据指定坐标创建⼀个点对象。

提供get、set ⽅法返回和设置坐标。

distance 返回两个点之间距离或当前点到指定坐标之间的距离。

同时设计应⽤类进⾏测试。

2. 设计⼀个三⾓形类,能判断给定三边是否构成三⾓形,能判断三⾓形的类型(普通、等腰、等边、直⾓,⽤枚举类型(参见第六章))能计算周长与⾯积。

并在应⽤类中演⽰。

3.定义⼀个Line 类,该类包含两个Point 类型的实例变量,⽤以表⽰线段的两个端点。

提供以下⽅法:计算线段长度;判断线段是否⽔平、判断是否为垂直、计算线段斜率、计算线段中点、判断两条线段是否相等。

并在应⽤类中演⽰。

4.定义两个包p1、p2,三个类C1、C2、C3.其中C1、C2 位于p1 中,C3 位于p2 中。

在C1 中定义四个不同访问控制修饰类型的变量,在C2、C3 中进⾏访问测试。

并练习在JDK 命令⾏下⽣成包。

三.⽅案设计对于第⼀题,⽤了staticstatic double distance(Point p1,Point p2){return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}对于第⼆题,采⽤if –else,严谨的判断三⾓形的形状public void judge(){if(a==b || b==c || c==a){if(a==b && b==c)System.out.println("该三⾓形为等边三⾓形。

西电软院数据结构实验报告-迷宫问题

西电软院数据结构实验报告-迷宫问题

实验报告:迷宫问题题目:编写一个求解迷宫通路的程序一、需求分析:1)采用二维数组maze[M][N]来表示迷宫,其中:maze[0][j]和maze[M-1][j](0≤j≤N-1)及maze[i][0]和maze[i][N-1](0≤i≤M-1)为添加在迷宫外围的一圈障碍。

数据元素值0表示通路,1表示障碍。

限定迷宫的大小M≤8,N≤10.2)本次实验直接在主程序中输入表示迷宫的二维数组。

另外,迷宫的入口和出口位置都将在主程序中直接设置。

3)实验中求出的迷宫通路用“-”表示,迷宫的障碍用“#”表示,已走过但未能求出通路的路径用“@”表示。

4)本程序只求出一条成功的通路。

5)本次实验将直接输出构建迷宫的二维数组、初始化的二维数组和求解后的迷宫数组。

二、概要设计:数据结构及其抽象数据类型的定义。

(1)栈的抽象数据类型ADT Stack{数据对象:D={ai| ai∈CharSet,i=1,2…n,n>=0}数据关系:R1={<ai-1, ai >| ai-1, ai∈D,i=2,…n}基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S已存在。

操作结果:销毁栈S。

ClearStack(&S)初始条件:栈S已存在。

操作结果:将S清为空栈。

StackLength(S)初始条件:栈S已存在。

操作结果:返回栈S的长度。

StackEmpty(S)初始条件:栈S已存在。

操作结果:若S为空栈,则返回TRUE,否则返回FALSE。

GetTop(S,&e)初始条件:栈S已存在。

操作结果:若栈S不空,则以e返回栈顶元素。

Push(&S, e)初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。

Pop(&S,&e)初始条件:栈S已存在。

操作结果:删除S的栈顶元素,并以e返回其值。

StackTraverse(S,visit())初始条件:栈S已存在。

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

第二次试验一、问题:Matrix-chain product分析:本题是矩阵链乘问题,需要求出最优括号化方案。

即在矩阵的乘法链上添加括号来改变运算顺序以使矩阵链乘法的代价降低。

可以分析该链乘的一个子段总结一些结论。

假设m[i,j]表示A i*…*A j的链成需要进行的乘法次数(假设j-i足够大),我们可以将A i*…*A j分为两段进行计算:(A i*…*A k)*(A k+1*…*A j)可以得出m[i,j]的递推公式可以得出,当i=j的时候,m[i,j]=0。

当i<j的时候。

k的取值范围是i到j-1,对于k的每一个取值都可以得到一个m[i,j]的值,取出最小值即时m[i,j]的最优化方案。

递推公式如下:可以根据上式得到一个递归算法。

本题即是求m[1,n]的值。

用二维数组m存储m[i,j]的值,用二维数组s来储存应当分割的位置。

以本题中第一个矩阵a) <3, 5, 2, 1,10>为例,可以得出如下矩阵:通过m数组可以得出最少的乘法次数,通过s数组可以输出最优方案。

遇到的问题:在输出s数组的结果的时候仍然需要递归调用,需要合适的控制递归的条件。

总结:在矩阵链乘问题中可以看出,动态规划结合递归的思想可以快捷的解决很多问题。

本题中,重点是归纳出m[i,j]的递推公式。

二、问题:Longest Common Subsequence分析:本题即是最长公共子序列问题。

假设有序列A[m]和序列B[n],显然,对于每一个[i,j],都对应着一个公共子序列的长度。

假设长度为c,就可以得到一个二维数组c[m,n]。

对于c[i,j],当Ai=Bj的时候,问题就转变为求A[1..i-1]和B[1..j-1]的公共子序列长度的问题,所以c[i,j]的长度就是c[i-1,j-1] + 1;同理,当Ai != Bj的时候,c[i,j]应该在c[i-1,j]与c[i,j-1]中取最大值。

另外,当i或者j等于0的时候,显然c的值为0。

由上面所述,可以得到递推公式如下:为了解决这个问题,还如要定义另一个数组用于存放c数组中每一个元素的来源。

这个来源其实就反映了公共子串。

可以通过箭头表示来源,相连的箭头序列中指向左上方的箭头最多的一串对应的就是最长公共子序列。

比如对于题目中给出的第一个例子X: xzyzzyx Y: zxyyzxz可以用一个矩阵表示计算的过程:遇到的问题:在算法中,‘=’是属于‘<’还是‘>’会给结果带来不同。

在输出子序列的时候,最长公共子序列可能不止一个,但是最终未能解决还是只能输出一个。

总结:最长公共子序列问题可以利用动态规划很好的解决。

动态规划的思想就是根据规律获得推导公式,然后解决问题。

三、问题:Longest Common Substring分析:最长公共子序列问题就是和最长公共子串问题差不多,就是当当Ai != Bj 的时候,对应的c[i,j]置为0。

推导公式如下:最终c数组的最大值max对应的就是最长公共子串,只需要将从本位置向前述max-1个的子串即是所求子串。

总结:本题就是第二题的一种特殊的情况,即c数组中的值不能从左和上两个方向获取,其他基本相同。

在代码上,只需要修改小部分代码就可以实现该问题。

四、问题:Max Sum分析:求和最大的子串。

这个问题和第三题很像,不过这次不用二维数组而是使用两个标记来标志所求子串的起始位置(maxb)结束位置(maxe)。

思路是,对于第i个元素,如果当前元素与目前选中的序列的sum小于0,那么这么序列不会被选择,更新sumb与sume的值;如果sum仍然大于0,则sum可以选中。

比较sum与max的值,如果sum>max,则更新maxb与maxe的值。

递推公式如下:遇到的问题:在全是负数时出现问题,后来讲max的初始值设置为第一个元素的值后就能正常了。

总结:动态规划能解决很多问题,找到递推公式非常重要。

五、问题:Shortest path in multistage graphs. Find the shortest path from 0 to 15 for the following graph.分析:观察本题图的特点,发现可以将图分解为7个部分,以此可以计算到每一个节点的最短的路径。

即可求出最终的最短路径。

总结:结合本题中的特殊情况,可以采用适当的方法来处理。

第三次实验一、问题:Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem both as fractional knapsack and 0/1 knapsack.分析:本题是背包问题的两个解法。

对于部分背包来说比较简单,就是将单位价值大的物品优先放置到背包中,这样就能在背包中获取最大的价值。

但是对于0/1背包问题来说,就相对复杂了。

可以通过贪心算法解决。

经过分析,我们转化这个问题为将n件物品放置到容量为w的容器中。

这里,每件物品只可能有一个状态:放入/不放入,我们用0/1来对应。

用v[i,w]来表示前i 件物品选出重量不超过w的物品,并且构成的最大的价值。

那么,可以分析得出v[i,w]的递推式。

如果i=0或者w=0,显然v[I,w] = 0;如果第i件物品的重量wi>w则i不可能放入容器中;如果i能够放入容器(即wi<w)则在vi+v[i-1,w-wi] > v[i-1,w]时才可能会放入。

关系式如下这样,我们可以认为,每一次都恰到好处的选择了放或者不放一个物品。

直到最后一个物品,我们得到的一定就是最好的结果总结:背包问题是一个典型的贪心算法的例子。

在解决问题的时候可以将当前步骤做到最好,然后通过推导,有可能得到一个关系式,这样就能使问题得到解决。

在本题中,我们可以通过第i件物品是否应该放在容量的w的背包中进行分析,最终得到了一个递推式。

二、问题:A simple scheduling problem. We are given jobs j1, j2…jn, all with knownrunning times t1, t2…tn, respectively. We have a single processor. What is the best way to schedule these jobs in order to minimize the average completion time. Assume that it is a nonpreemptive scheduling: once a job is started, it must run to completion. The following is an instance。

分析:这是一个线程调度问题,通过操作系统课程的学习,我们了解到应当采用短作业优先的调度方式。

可以采用快速排序对进程顺序进行排序即可得到调度时间。

总结:在进程调度问题中,如果想获取最短的平均周转时间(单线程)应当使用短作业优先的算法。

三、问题:单源点最短路径分析:本题中,因为路径中存在负边,所以应当使用bellman-ford算法。

为了方便的使用该算法,需要首先创建合适的边的数据结构。

这样,在遍历边的时候比较快捷。

首先需要初始化每一个节点的d值,源点的d值为0,其他点的d值的初始值为max(一个足够大的数)。

表示在初始时,源点到各点都不可达。

然后,对每条边进行松弛操作,进行|V|-1次松弛之后,可以得到结果。

随后,检测结果,如果依然存在可松弛的节点的话,说明存在权重为负的环路。

表明结果不存在。

总结:该算法并没有在一开始就计算是否存在权值为负的环路。

而是通过结果来分析,如果没有负环路,一定能在松弛循环结束后便不能继续被松弛。

由此,可以判断是否存在最短路径。

所以,该算法不仅可以判断一个图是否存在最短路径,还能得到最短路径。

四、问题:All-pairs shortest paths分析:所有节点对的最短路径问题,应当使用Johnson算法。

Johnson算法需要用dijkstra和bellman-ford算法作为子程序。

如果图G=(V,E)中所有的边权重都为非负值,可以通过在每一个节点使用dijkstra算法求出所有节点虹之间的最短路径;如果该图包含权值为负的边,但是没有权重为负的环路,那么只要计算一组新的非负权重值,然后使用同样的方法即可。

总结:Johnson算法相当于是对dijkstra算法和bellman-ford算法的应用,结合这两个算法,通过使用重新赋值权重来生成非负权重,最终得到所有节点对之间的最短路径。

第四次实验一、题目:0/1 Knapsack Problem. There are 5 items that have a value and weight list below, the knapsack can contain at most 100 Lbs. Solve the problem using back-tracking algorithm and try to draw the tree generated.分析:使用回溯法解决0/1背包问题。

可以用一个数组来记录“选中”物品的情况。

首先,选择第一件物品,如果超重的话不选择该物品;如果没有超重,继续添加下一个物品,这样选择下去,最终一定可以选择完全部的物品。

计算目前选择物品的totalValue值。

继续回溯,如果的到新的totalValue值,如果大于前一个值,那么更新该值,并且更新保存选择的数组中。

总结:从8皇后问题可以发现回溯法的一般方法。

经过代入到这个问题中,发现确实可行。

回溯法需要一个合理的递归函数,这个函数的终止条件也需要认真的分析。

比如这一题和8皇后问题都可以使用元素的个数作为一个结束条件,另外还需要注意导致“回溯”的位置。

二、题目:Solve the 8-Queen problem using back-tracking algorithm.分析:8皇后问题是回溯法的一个典型的例题。

假设目前已经在奇葩的前i(i<8)行放置了i和皇后并且位置合法。

然后我们放置第j(j=i+1)个皇后,先将j 放置在第一列,如果合法就放置第j+1个皇后;如果放置在当前列不合法,就将j皇后放置在第二列……以此类推,如果全部不行,将会返回调用该函数的上一层函数。

如果i的值等于8,说明已经完全摆放成功,就可以输出结果,输出后返回上一层调用,继续查找其他的符合题意的皇后摆放。

相关文档
最新文档