本科实验报告 课程名称:算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真 指导教师:郝晓丽
2018年05月04 日 实验一递归与分治算法 1.1 实验目的与要求 1.进一步熟悉C/C++语言的集成开发环境; 2.通过本实验加深对递归与分治策略的理解和运用。 1.2 实验课时 2学时 1.3 实验原理 分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。 需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。 1.4 实验题目 1.上机题目:格雷码构造问题 Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。 对于给定的正整数n,格雷码为满足如下条件的一个编码序列。 (1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2)序列中无相同的编码。 (3)序列中位置相邻的两个编码恰有一位不同。 2.设计思想:
根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011 010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:
《算法设计与分析》实验报告一 学号:姓名: 日期: 2012.11.5 得分: 一、实验内容: 分别用蛮力法、分治法、减治法实现a^n。 二、实验要求: 完成试验报告、给出对此结果。 为防止大数溢出,可以用1^n来测试在n比较大是的三种算法运行情况。 四、源程序及注释: #include } int main() { int a=1; int n=10000; LARGE_INTEGER start1,end1,start2,end2,start3,end3,f; QueryPerformanceFrequency(&f); QueryPerformanceCounter(&start1) ; int p1=Power1(a,n); QueryPerformanceCounter(&end1); QueryPerformanceCounter(&start2) ; int p2=Power2(a,n); QueryPerformanceCounter(&end2); QueryPerformanceCounter(&start3) ; int p3=Power3(a,n); QueryPerformanceCounter(&end3); cout<<"a="< 华北电力大学 实验报告| | 实验名称算法设计与分析综合实验 课程名称算法设计与分析 | | 专业班级软件12 学生姓名: 学号:成绩: 指导教师:胡朝举实验日期: 实验一分治策略—归并排序 一、实验要求 (1)编写一个模板函数:template 题目描述:设计蛮力算法求解小规模的线性规划问题,假设约束条件为: (1)x+y<=4;(2)x+3y<=6;(3)x>+0;y>=0,使目标函数3x+5y取得最大值 */ /* 思路:用两个for遍历用一个if比较找出最大的。 */ #include 算法设计与分析课程实验项目目录 学生姓名:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。 本科实验报告专用纸 课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号 201 实验项目类型设计实验地点机房 学生姓名学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间 2012年 3月 1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要内容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验内容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人给出的: S END +MORE MONEY . 这 里有两个前提假设:第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。 3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。) 本科实验报告专用纸(附页) 该算法程序代码如下: #include "" #include "" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l 实验题目 设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。 实验目的 (1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。 实验内容(包括代码和对应的执行结果截图) #include L.count=max; L.data = new Node[L.count];//====================动态空间分配 cout<<"输入"< 算法设计与分析课程实验项目目录 学生:学号: *实验项目类型:演示性、验证性、综合性、设计性实验。 *此表由学生按顺序填写。 本科实验报告专用纸 课程名称算法设计与分析成绩评定 实验项目名称蛮力法指导教师 实验项目编号实验项目类型设计实验地点机房 学生学号 学院信息科学技术学院数学系信息与计算科学专业级 实验时间2012年3月1 日~6月30日温度24℃ 1.实验目的和要求: 熟悉蛮力法的设计思想。 2.实验原理和主要容: 实验原理:蛮力法常直接基于问题的描述和所涉及的概念解决问题。 实验容:以下题目任选其一 1).为蛮力字符串匹配写一段可视化程序。 2).写一个程序,实现凸包问题的蛮力算法。 3).最著名的算式谜题是由大名鼎鼎的英国谜人 H.E.Dudeney(1857-1930)给出的: S END +MORE MONEY . 这里有两个前提假设: 第一,字母和十进制数字之间一一对应,也就是每个字母只代表一个数字,而且不同的字母代表不同的数字;第二,数字0不出现在任何数的最左边。求解一个字母算术意味着找到每个字母代表的是哪个数字。请注意,解可能并不是唯一的,不同人的解可能并不相同。3.实验结果及分析: (将程序和实验结果粘贴,程序能够注释清楚更好。) 该算法程序代码如下: #include "stdafx.h" #include "time.h" int main(int argc, char* argv[]) { int x[100],y[100]; int a,b,c,i,j,k,l,m,n=0,p,t1[100],num; int xsat[100],ysat[100]; printf("请输入点的个数:\n"); scanf("%d",&num); getchar(); clock_t start,end; start=clock(); printf("请输入各点坐标:\n"); for(l=0;l 算法设计与分析 项目名称:用蛮力法、动态规划法和贪心法求解0/1背包问题 作者姓名:余武丹 李红波 刘红梅 完成日期:2013年9月20日 目录 第一章:简介(Introduction) 第二章:算法定义(Algorithm Specification) 第三章:测试结果(Testing Results) 第四章:分析和讨论 第一章:简介(Introduction ) 0/1背包问题是给定n 个重量为{w 1, w 2, … ,wn }、价值为{v 1, v 2, … ,vn }的物品和一个容量为C 的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中。 在0/1背包问题中,物品i 或者被装入背包,或者不被装入背包,设xi 表示物品i 装入背包的情况,则当xi =0时,表示物品i 没有被装入背包,xi =1时,表示物品i 被装入背包。根据问题的要求,有如下约束条件和目标函数: 于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X =(x 1, x 2, …, xn )。 背包的数据结构的设计: typedef struct object { int n;//物品的编号 int w;//物品的重量 int v;//物品的价值 }wup; wup wp[N];//物品的数组,N 为物品的个数 int c;//背包的总重量 第二章:算法定义(Algorithm Specification ) 1、蛮力法 蛮力法是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。蛮力法的关键是依次处理所有的元素。 用蛮力法解决0/1背包问题,需要考虑给定n 个物品集合的所有子集,找出所有可能的子集(总重量不超过背包容量的子集),计算每个子集的总价值,然后在他们中找到价值最大的子集。 所以蛮力法解0/1背包问题的关键是如何求n 个物品集合的所有子集,n 个物品的子集有2的n 次方个,用一个2的n 次方行n 列的数组保存生成的子集,以下是生成子集的算法: void force(int a[][4])//蛮力法产生4个物品的子集 { int i,j; int n=16; int m,t; for(i=0;i<16;i++) ????? ≤≤∈≤∑=) 1(}1,0{1 n i x C x w i n i i i (式1) ∑=n i i i x v 1 max (式2) 算法设计与分析实验报告 教师: 学号: 姓名: 实验一:串匹配问题 实验目的:(1) 深刻理解并掌握蛮力法的设计思想; (2) 提高应用蛮力法设计算法的技能; (3) 理解这样一个观点: 用蛮力法设计的算法, 一般来说, 经过适度的努力后, 都可以对算法的第一个版本进行一定程度的改良, 改进其时间性能。 三、实验要求:( 1) 实现BF 算法; (2 ) 实现BF 算法的改进算法: KMP 算法和BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析, 并设计实验程序验证 分析结果。 #include "stdio.h" #include "conio.h" #include 作业一 学号:______ 姓名:________ P135 2. a.为一个分治算法编写伪代码,该算法同时求出一个元素数组的最大元素和 最小元素的值。 解:算法:EXTREMUM(A[],EXTREMUM_MAX, EXTREMUM_MIN) //递归调用EXTREMUM函数来找出数组A[]的最大元素和 最小元素。 //输入:数值数组A[] //输出:最大值EXTREMUM_MAX和最小值EXTREMUM_MIN if() //只有一个元素 EXTREMUM_MAX A[]; EXTREMUM_MIN A[]; else if //有两个元素 if EXTREMUM_MAX; EXTREMUM_MIN; else EXTREMUM_MAX; EXTREMUM_MIN; else EXTREMUM(,EXTREMUM_MAX_01, EXTREMUM_MIN_01); EXTREMUM(,EXTREMUM_MAX_02, EXTREMUM_MIN_02); if EXTREMUM_MAX_01 EXTREMUM_MAX_02 EXTREMUM_MAX = EXTREMUM_MAX_02; If EXTREMUM_MIN_02 EXTREMUM_MIN_01 EXTREMUM_MIN = EXTREMUM_MIN_02; b. 假设,为该算法的键值比较次数建立递推关系式并求解。 解: c.将该算法与解决同样问题的蛮力法做一个比较 蛮力法时间时间复杂度为2n-2,分治算法的为3n/2-2,虽然都属于Θ(n)级别,但是分治算法速度要比蛮力算法快。 5.1.3 a.为一个分治算法编写伪代码,该算法用来计算指数函数a n的值,其中a>0, n 是一个正整数。 //该算法使用分治法来计算a n Pow(a,n) If n = 1 return a else p←pow(a,n/2); If n mod 2 = 1 return p*p*a; else return p*p; b.建立该算法执行的乘法次数的递推关系式并求解 c.将该算法与解决同样问题的蛮力法做一个比较 蛮力法时间复杂度为n,分治法为,分治法速度明显要 高于蛮力法。 【一】实验目的(小四黑体) 1.采用蛮力法实现序列排序; 2.分析各种方法的优缺点。 【二】实验内容(小四黑体) 1.采用蛮力排序算法对序列排序; 2.编程实现选择排序与冒泡排序; 3.分析比较2种算法的时间复杂度; 4.试着改进冒泡排序,使算法在序列达到有序状态时停止运行。【三】实验步骤(代码、结果)(小四黑体) #include <> #include <> #include <> void SelectionSort(int a[],int n) { int i,j,t,temp; for(i=0; i<=n-2; i++) { t=i; for(j=i+1; j<=n-1; j++) { if(a[j] { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } } void BubbleSort1(int a[],int n) { int falg=1; int i,temp; while(falg) { falg=0; for(i=0;i 实验项目三 用蛮力法、动态规划法和贪心法求解0/1 背包问题 实验目的 1、学会背包的数据结构的设计,针对不同的问题涉及到的对象的数据结构的设计也不同; 2、对0-1背包问题的算法设计策略对比与分析。 实验内容: 0/1背包问题是给定n 个重量为{w 1, w 2, … ,wn }、价值为{v 1, v 2, … ,vn }的物品和一个容量为C 的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中。 在0/1背包问题中,物品i 或者被装入背包,或者不被装入背包,设xi 表示物品i 装入背包的情况,则当xi =0时,表示物品i 没有被装入背包,xi =1时,表示物品i 被装入背包。根据问题的要求,有如下约束条件和目标函数: 于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X =(x 1, x 2, …, xn )。 背包的数据结构的设计: typedef struct object { int n;//物品的编号 int w;//物品的重量 int v;//物品的价值 }wup; wup wp[N];//物品的数组,N 为物品的个数 int c;//背包的总重量 1、蛮力法 蛮力法是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。蛮力法的关键是依次处理所有的元素。 用蛮力法解决0/1背包问题,需要考虑给定n 个物品集合的所有子集,找出所有可能的子集(总重量不超过背包容量的子集),计算每个子集的总价值,然后在他们中找到价值最大的子集。 所以蛮力法解0/1背包问题的关键是如何求n 个物品集合的所有子集,n 个物品的子集有2的n 次方个,用一个2的n 次方行n 列的数组保存生成的子集,以下是生成子集的算法: ?????≤≤∈≤∑=)1(}1,0{1n i x C x w i n i i i (式1) ∑=n i i i x v 1max (式2) 蛮力算法:选择排序冒泡排序(详解) 2015/10/26 1 蛮力法:蛮力法(brute force)是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。虽然巧妙而高效的算法很少来自于蛮力法,但它还是具有重要地位。因为它能解决几乎任何问题,如果要解决的问题的规模不大,或者对性能没有很高的要求,那么花大工夫涉及复杂的算法显然是不值得的。下面就来介绍一下2大蛮力排序算法,然后是它们的分析。 ?框架介绍:在介绍算法之前,有必要介绍一些以后会用到的方法。使用前2个方法,我们就可以生成随机数组,然后方便地判断数列是否被正确排序了,以此验证排序算法的正确性。第3个方法从标准输入中读取数据(通过重定向),进行大规模排序,以此比较不同算法的性能。 ?/** * 生成一个长度为0~600的数组,每个元素的值为0~99999的整数。* * @return */ public static Integer[] randomArray() { Integer[] r = new Integer[(int) (600 * Math.random())]; for (int i = 0; i r.length; i++) r[i] = (int) (99999 * Math.random()); return r; } /** * 返回一个数组是否是有序的。* @param r * @return */ public static boolean isSorted(Integer[] r) { for (int i = 1; i r.length; i++) if (r[i]pareTo(r[i - 1]) 0) return false; return true; } /** * 从标准输入中读取1000000个整数的数组。* @return */ public static Integer[] arrayIn(){ Scanner in = new Scanner(System.in); Integer[] r = new Integer[1000000]; for(int i=0;i 1000000;i++) r[i] = in.nextInt(); return r; }选择排序:选择排序开始的时候,我们扫描整个列表,找到它的最小元素,然后和第一个元素交换(如果第一个元素就是最小元素,那么它就和自己交换。)。再次,在剩下的元素中找到最小元素,将它和数组的第二个元素交换位置,以此往复,直到整个数组有序。这种算法叫做选择排序,因为它每次都选择剩余元素之中最小的元素放在正确位置。 public static void selection(Integer[] r) { int N = r.length; for (int i = 0; i N - 1; i++) { int min = i;//已知最小元素的索引for (int j = i + 1; j j++) if (r[min] r[j])//如果找到更小的元素,更新索引min = j; int temp = r[i];//交换位置r[i] = r[min]; r[min] = temp; } } 分金块问题的解决思想和算法设计王雕40912127 2009级计算机科学与技术三班 摘要:在日常生活中,分金块问题是一个常见的问题,人们总是会面临怎样比较大小。本文给出了较为常用的两种算法—蛮力法和分治法。 关键词:分金块问题;蛮力法(非递归);分治法; 1 问题概述 老板有n个金块,希望最优秀的雇员得到其中最重要的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,如何用最少的比较次数找出最重和最轻的金块? 2 理解金块问题:以9以内的实例理解问题 金块示例 问题:1.最重的是那块?用max标记 2.最轻的是那块?用max标记 3 求解金块问题的常用算法一蛮力法 蛮力法的设计思想:蛮力法,也称穷举法,是一种简单而直接地解决问题的方法,常常直接基于问题的描述,因此,也是最容易应用的方法。但是,用蛮力法设计的算法其时间性能往往是最低的,典型的指数时间算法一般都是通过蛮力搜索而得到的。即从第一块开始查找,查找哪块最重,哪块最轻。 a[0] a[1] a[2] a[3] max 4算法设计: Maxmin(float a[],int n) {max=a[1];min=a[1]; for(i=2;i<=n;i=i+1) {if(max max=a[i] else if(min>a[i]) min=a[i] } Return(max, min) } Step1 将所有金块重量存于数组 Step2 将第一个金块同时标记为最重和最轻的金块 Step3 将第一个与后一个进行重量的比较,将更重的标记为max,同时如果现阶段最轻的比后者轻,那么将后者标记为min。 Step4 依次进行比较,最重得到最重的和最轻的max min. 5算法分析:(1)时间复杂性和空间复杂性。 分析该算法可以看出,比较操作max算法实验报告
算法分析与设计第三章课后练习题
算法设计与分析实验报告
蛮力法分治法求最近对
《算法设计与分析》实验报告
用蛮力法、动态规划法和贪心法求解01背包问题
算法设计与分析实验报告
《算法设计与分析基础(第3版)》部分习题答案
算法分析实验3蛮力法排序
实验项目三 用蛮力法、动态规划法和贪心法求解背包问题
【IT专家】蛮力算法: 选择排序 冒泡排序(详解)
分金块问题的两种算法实验报告
算法设计与分析部分算法伪代码