算法分析大作业
算法分析与设计大作业
算法分析与设计大作业摘要:本文以算法分析与设计为主题,对算法的概念、分析和设计进行了探讨。
首先介绍了算法的概念和基本特征,其次分析了算法的效率和复杂度,并介绍了常用的算法复杂度表示方法。
然后,通过实例分析了几种常用的排序算法的性能与复杂度,并对它们进行了比较。
最后,总结了算法分析与设计的重要性,并提出了进一步研究的方向。
一、引言随着计算机技术的快速发展,算法分析与设计成为计算机领域中的重要研究方向。
算法是指解决特定问题的具体步骤和方法,是计算机科学的核心和基础。
算法的效率和复杂度对计算机的性能和运行时间有着直接的影响,因此算法的分析和设计非常重要。
二、算法的概念和特征算法是指在有限的时间内解决特定问题的一种方法。
它具有以下特征:输入、输出、确定性、有穷性和可行性。
输入是指算法接受的问题的数据或信息,输出是指算法求解得到的问题的解。
确定性是指算法在任何情况下都能够得到相同的结果。
有穷性是指算法在执行有限的步骤后能够终止。
可行性是指算法的每一步都是可行的,即能够被计算机执行。
三、算法的效率和复杂度算法的效率是指算法解决问题所需要的时间和空间资源的多少。
算法的复杂度是用来描述算法执行过程中所需要的资源的多少。
常用的算法复杂度表示方法有时间复杂度和空间复杂度。
时间复杂度表示算法的执行时间与输入规模之间的关系,用大写O表示。
空间复杂度表示算法所需的空间资源与输入规模之间的关系,用大写S表示。
四、常用的排序算法及性能与复杂度分析1.插入排序插入排序是一种简单直观的排序算法。
它的基本思想是将未排序的元素逐个插入到已排序的序列中。
插入的过程中,需要比较和移动元素的次数与未排序序列中的元素个数相关,因此时间复杂度为O(n^2)。
空间复杂度为O(1)。
2.冒泡排序冒泡排序是一种重复比较相邻元素并交换位置的排序算法。
它的基本思想是两两比较相邻元素,如果顺序错误则交换位置。
冒泡的过程中,需要进行n-1次的比较和交换操作,因此时间复杂度为O(n^2)。
算法设计与分析报告大作业
算法分析与设计大作业班级: 12信科姓名:郭倩南学号: 1242155105完成日期: 2015-6-4指导教师:陈平序号选定题目所用算法设计技术1数字三角形问题动态规划2集合划分问题分治法回溯法3求子集问题评分:大作业报告1、数字三角形问题一、问题描述对于给定的由n行数字组成的数字三角形,计算从三角形的底至顶的路径经过的数字和的最大值。
如:73 88 1 02 7 4 44 5 2 6 5二、实验内容与实验步骤实验内容:输入数据的第1 行是数字三角形的行数n,1<=n<=100。
接下来n行是数字三角形各行中的数字。
所有数字在0..99之间实验步骤:1、首先证明该问题满足最优化原理最优化原理:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。
简而言之,一个最优化策略的子策略总是最优的。
2、建立动态规划函数3、填表三、实验环境Window7系统,vc++6.0软件四、问题分析由观察数字三角形可知,从数字三角形的顶层出发,下一层选择向左还是向右取决于两个4层数字三角形的最大数字和,而对于第四层的决定取决于第三层的最大数字和,依次类推,可知该问题是多阶段决策最优化问题,并且划分出来的子问题是相互重叠的,所以该问题采用动态规划法解决动态规划:与分治法相似,把问题分解按层次分成子问题,直到可以直接求解的子问题,然后一级一级地向上求解。
与分治法的出别在于:动态规划适用有许多重复子问题出现的问题,它保存已求出问题的解。
73 8 3 88 1 0 8 1 1 02 7 4 4 2 7 4 7 4 4 4 5 2 6 5 4 5 2 6 5 2 6 5一个五层数字三角形子问题〔1〕子问题〔2〕五、问题解决〔1〕根据对问题的分析,写出解决方法。
1、证明:S,S1,S2,..Sn,t是从S到t的一条数字和最大的路径,从源点S开始,设从S到下一段的顶点S1已经求出,如此问题转化为求从S1到t的数字和最大的路径,显然S1,S2,...Sn,t一定构成一条从S1到t的数字和最大值的路径,如假如不然,设S1,r1,r2,....rq,t是一条数字和最大的路径,如此S,S1,r1,r2,....rq,t的路径经过数字和的最大值比S,S1,S2,...Sn,t的路径数字和更大,从而导致矛盾,所以数字三角形问题满足最优性原理。
算法设计与分析课程大作业
题目作业调度问题及算法分析学院名称:计算机与信息工程学院专业名称:计算机科学与技术目录《算法设计与分析》课程大作业 (1)一.动态规划算法解决流水作业调度 (3)1、问题描述 (3)2、算法分析 (3)3. 算法的描述 (4)4、部分算法实现 (5)5. 运行结果 (6)6、时空效率分析 (6)二.贪心算法解多机调度问题 (6)1、问题描述 (6)2、算法分析 (7)3.部分算法实现 (7)4.计算复杂性分析 (8)5. 运行结果 (9)三.回溯法解决批作业调度问题 (9)1.问题描述 (9)2.算法思想 (10)3. 部分算法实现 (11)4.运行结果 (12)5.时间复杂性分析 (12)四.作业调度算法比较 (12)五.课程学习总结 (13)摘要:在现代企业中,作业调度已成为提高资源利用率、从而提高企业运行效益的关键环节之一。
把各个作业分配到车间现有的设备上,并确定它们的先后次序,这是一项复杂的工作本文就作业调度排序问题进行了研究,通过对几个经典作业调度算法的分析讨论,总结了各个算法对作业调度的求解过程,并给出了每个算法的复杂度及性能分析。
关键词:作业调度;动态规划;贪心算法;回溯法;一.动态规划算法解决流水作业调度1、问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
2、算法分析直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
在一般情况下,机器M1开始加工S 中作业时,机器M2还在加工其他作业,要等时间t 后才可利用。
将这种情况下完成S 中作业所需的最短时间记为T(S,t)。
Linux大作业的算法分析怎么写
Linux大作业的算法分析怎么写Linux大作业分析框架1、以算法输入规模n作为参数进行分析算法效率2、时间复杂度:找出基本操作O(1),再计算它的运行次数(忽略乘法常量,仅关注增长次数)3、增长次数:log2n4、最差、平均和最佳效率均是指输入规模为n时候的效率(平均效率可以引用已知的推到结果)主要概括分析框架:1、算法的时间效率和空间效率都用输入规模的函数进行度量。
2、用算法的基本操作的执行次数来度量时间效率,用算法消耗的额外单位的数量来度量空间单位3、在输入规模相同的情况下,有写算法的效率会有显著的差异,对于这类算法需要分析最差、平均和最佳效率4、框架主要关心:输入规模趋向于无限大的情况下它的效率问题渐近符号和基本效率类型1、O(g(n))是增长次数&lt;=c*g(n)的函数集合,上阶2、Ω(g(n))是增长次数&gt;=c*g(n)的函数集合,下阶3、θ(g(n))是增长次数=c*g(n)的函数集合,同阶可以利用极限进行比较增长次数(洛必达法则)算法整体效率是由具有较大增长次数的部分所决定的。
非递归问题的数学分析的通用方案1、决定哪个参数表示输入规模的度量标准2、找出算法的基本操作3、检查基本操作的执行次数是否只依赖于输入规模,如果它还依赖于一些其他的特性(例如:元素在数组中的位置等)则分析最差、平均和最佳效率4、建立一个算法基本操作执行次数的求和表达式(有可能是递推表达式)5、利用求和运算的标准运算或者法则来建立一个操作次数的闭合公式,或者至少确定它的增长次数递归问题的数学分析的通用方案1、决定哪个参数表示输入规模的度量标准2、找出算法的基本操作3、检查基本操作的执行次数是否只依赖于输入规模,如果它还依赖于一些其他的特性(例如:元素在数组中的位置等)则分析最差、平均和最佳效率4、对于算法基本操作执行次数,建立一个递推关系以及相应的初始条件。
5、解这个递推式,或者至少确定它的增长次数。
算法设计与分析大作业评分标准
课号:____CK5J08A ___ 课名:_____算法设计与分析______教师: ________________期末大作业要求:在以下几种方式中任选一种一.算法实际应用题任务要求:1.完成一个有一定实用性的程序,其中包含稍复杂的算法模块,算法输入和输出必须显示在图形界面上,最好能把算法运行过程展现在图形界面上。
2.撰写算法设计报告,描述算法设计流程,分析算法效率。
3.进行答辩。
评分标准:1.图形界面的操作方便性与对算法的展现程度(30分)2.算法的复杂程度和算法效率和实用性(30分)3.算法设计流程的解释的清晰度和算法效率分析的准确度(30分)4.答辩10分,采用教师提问学生回答和解释的形式,学生若不能自圆其说、对自己设计的算法流程也讲不清楚,则判定为抄袭,整个大作业为0分。
参考题目:1.算242.倒油3.趣味算式4.马步问题5.单源最短路径6.最小生成树7.工作分配8.2*2*2魔方9.长江游艇10.推箱子11.华容道12.文件搜索13.………..二.ACM算法设计题任务要求:1.完成2道及2道以上ACM算法设计题,题目由教师给定并公布在OJ系统中,学生限定时间内(2个小时),在其中选做2题以上,正确性也由OJ系统判定,并参照OJ系统的标准,形成排名。
完成数量不到2题的,不管排名如何,整个大作业都判定为不及格。
2.为所完成的每道题目撰写解题报告,描述设计思路与流程,分析课号:____CK5J08A ___ 课名:_____算法设计与分析______教师: ________________程序的时空效率。
评分标准:1.算法设计能力(60分),主要根据OJ系统中的排名来评定,部分提交的题目有抄袭嫌疑的学生,教师对其进行质询答辩,采用问答形式,学生若对其提交正确的任何题目,无法通过质询答辩,则判定为抄袭,整个大作业为0分。
2.算法表述与分析能力(40分),根据提交的解题报告中,对算法流程的描述的清晰程度,对算法时空效率的分析的准确程度,进行评定。
算法设计与分析大作业报告
《算法设计与分析大作业报告》班级:学号:姓名:分治法大作业报告问题陈述:编程实现归并排序算法和快速排序算法,输出排序结果。
输入10组相同的数据,验证排序结果和完成排序的比较次数。
分治法基本思想:分治法的基本思想是将问题分解成若干个子问题,然后求解子问题。
子问题较原问题要容易些,先得出子问题的解,由此得出原问题的解,这就是所谓“分而治之”的思想。
算法描述:当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。
那末,对于这类问题分治法是十分有效的。
本实验就是通过归并排序和快速排序来体现分治的思想。
1.归并排序的思想:将A(1),……,A(N)分成两个集合,对每个集合单独分类,然后将已分类的两个序列归并成一个含N个元素分好类的元素2.快速排序的思想:选取A的某个元素做为划分元素,然后将其他元素重新排列,使在划分元素以前出现的元素都小于或等于它,在划分元素之后出现的划分元素都大于等于它。
程序代码:#include <stdio.h>#include <time.h>#include <stdlib.h>void MergeSort(int *data,int x,int y,int *temp){ int p,q,m,i=x;if (y-x>1){m = x+(y-x)/2;p = x;q = m;MergeSort(data,x,m,temp);MergeSort(data,m,y,temp);while(p<m||q<y){if (q>=y||(p<m&&data[p]<data[q])){temp[i++] = data[p++];}else{temp[i++] = data[q++];}}for(i=x;i<y;i++)data[i] = temp[i]; }}void HoareSort(int *data,int x,int y){int p=x,q=y-1,temp;while(p<q) {while (q>p&&data[q]>=data[p])q--;if (q>p){temp = data[p],data[p] = data[q],data[q] =temp;p++;}while(q>p&&data[p]<=data[q])p++;if (p<q){temp = data[p],data[p] = data[q],data[q] =temp;q--;}if (p==q) {HoareSort(data,x,p);HoareSort(data,p+1,y);}}}int main(){int data[10],i;int temp[10];srand(time(NULL));for (i=0;i<10;i++){ data[i] = rand()%100; }printf("未排序排序的数据为:\n");for (i=0;i<10;i++){printf("%d ",data[i]);}printf("\n");printf("归并排序的顺序为: \n");MergeSort(data,0,10,temp);for (i=0;i<10;i++){printf("%d ",data[i]); }printf("\n");printf("快速排序的顺序为: \n");HoareSort(data,0,10);for (i=0;i<10;i++){printf("%d ",data[i]);}printf("\n");return 0;}运行结果:结论分析:归并排序和快速排序都是递归排序,但是归并排序是稳定的排序方法,快速排序是不稳定的排序方法。
【图文】算法分析与设计大作业
算法理论、教改类题目学习大量相关算法(程序),总结出对应方法的一些特点,将其写成论文形式,并以足够的例子作为佐证。
24.论分治法、动态规划、贪心法的区别 25.论递归程序向非递归程序的转换 26.论应用型本科院校算法课程的教学目标和教学方法 27.论二叉树在计算机科学与技术中的应用 28.数据库索引的算法解释 29.论贪心法的适用范围 30.解空间搜索方法的选择依据 31.分治法算法分析综述
算法应用、算法研究类题目查阅大量相关资料,对相关内容给出初步的结果。
31.基于UCCI的中国象棋对弈引擎开发技术研究 32.五子棋对弈关键技术研究33.黑白棋对弈关键技术研究 34.数独初始局面生成算法研究 35.支持按文件名搜索的索引构造技术研究 36.通用回溯算法演示系统设计 37.通用分支限界算法演示系统设计 38.通用排序算法演示系统设计 39.通用动态规划算法演示系统设计
40.论文阅读和翻译类题目• 给出一个英文文献,用准确的语言将其翻译为中文,不需要逐字逐句翻译,但主要观点、算法思想和算法过程表述清楚、准确、充分。
格式要求• 论文正文中不得出现大段代码(超过10行)• 标题样式需规范• 参考文献不低于10篇,参考文献格式和标注位置须规范。
算法分析与设计作业
最接近点对问题问题此问题分为一维,二维,三维的情况1. 一维: 给定直线上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这个问题比较简单,是引出二维解法的一个引子,因为一维的直线上的点,相邻点的距离肯定小于相隔的点的距离,只需要考虑相邻点即可。
2. 二维:给定平面上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这是我们这一问题的重点3. 三维:给定空间上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,此问题是二维的解法的复杂化,具体可以在飞机航线等问题上运用,但在此不多做介绍。
基本思想由于该问题的基本解法是去考察每个点和其他所有点的距离。
因此它的时间复杂度是2()O n ,这样做的效率太低,我们就要去寻找一个更高效的办法:分治法。
1. 因二维的情况太过复杂,先考虑一维的情况中,可以用分治法对其进行分部计算: 把直线分成两部分, 1s 2s ,分别求出其最接近点的距离1d 2d 。
但分割开的地方的两点距离可能小于这两个值,这三个值进行比较之后,得到最后结果。
2. 鉴于此,二维的也可以用此方法进行计算:把待计算的点s 分成两部分1s 2s ,分别求出其最接近点的距离1d 2d 。
但1d 2d 最小的未必是s 中的最小距离d ,它有可能是1s 中的一个点和2s 中的一个点组成的最接近点对。
所以还要考虑1s 中的所有点到2s 中的每一个点的距离,一一比较之后得出一个最小值,再和1d 2d 比较,这就得出了最后结果。
3. 接下来是具体算法实现的步骤:1. 把待计算的点s 分成两部分1s 2s :重要的如何去划分,这里采用在二维平面上的中线(用横坐标的最小值加上最大值的平均数)来划分。
2. 分别求出其最接近点的距离1d 2d :这可以用一个递归来完成。
3. 计算1s 中的所有点到2s 中的每一个点的距离:这个问题是此问题的关键。
算法分析 期末大作业内容
算法设计与分析期末成绩考核标准要求:算法设计与分析考试方式为小论文形式。
下面给出了小论文的参考模型和参考题目,供大家选择。
1.小作业题目(仅供参考)(题目的难易:●简单10道题★中等11道题▲复杂10道题)●最佳浏览路线问题问题描述:某旅游区的街道呈网格状,其中东西向的街道都是旅游街,南向的街道都是林荫道。
由于游客众多,旅游街被规定为单行道。
游客在旅游街上只能从西向东走,在林荫道上既可以由南向北走,也可以从北向南走。
阿隆想到这个旅游区游玩,他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之间的道路浏览的必要程度,分值从-100到100的整数,所有林荫道不打分,所有分值不可能全是负值。
阿隆可以从任一路口开始浏览,在任一路口结束浏览,请写出一个算法,帮助阿隆寻找一条最佳的浏览路线,使得这条路线的所有分值总和最大。
(算法设计与分析第二版P190—11题)●问题描述:某工业生产部门根据国家计划的安排,拟将某种高效率的5台机器,分配给所属的,A,B,C个工厂,各工厂在获得这种机器后,可以为国家盈利如图表所示,问:这5台机器如何分配给各工厂,才能使得国家盈利最大?(P190-14题)●问题描述:编写算法对输入的一个整数,判断他能否被4,7,9整除,并输出一下信息之一,能同时被4,7,9整除;能被其中两个数(要指出那两个)整除能被其中一个数(要指出哪一个)整除不能被4,7,9任一个整除。
(P118-16)●问题描述:某一印刷厂有6项加工任务,对印刷车间和装订车间所需的时间表如下图:完成每项任务都要先去印刷车间印刷,再到装订车间装订。
问咋样安排这6项加工任务的加工工序,使得加工工时最少?(P191-17)●问题描述:编写用动态规划法求组合数mC的算法(P191-19).n●问题描述:仿照分治算法中两个大数相乘的算法策略,完成求解两个n*n阶矩阵A和矩阵B的乘积的算法。
假设n=2k,要求算法的复杂性要小于O(n3).(P190-12)●问题描述:在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照5个方向前进但不能跃出方格,如图所示,人每走过一个方格必须取此方格中的数。
算法设计与分析课程大作业
算法设计与分析课程大作业-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN题目作业调度问题及算法分析学院名称:计算机与信息工程学院专业名称:计算机科学与技术目录《算法设计与分析》课程大作业.................................................................... 错误!未定义书签。
一.动态规划算法解决流水作业调度. (4)1、问题描述 (4)2、算法分析 (4)3. 算法的描述 (5)4、部分算法实现 (6)5. 运行结果 (7)6、时空效率分析 (7)二.贪心算法解多机调度问题 (7)1、问题描述 (7)2、算法分析 (7)3.部分算法实现 (7)4.计算复杂性分析 (8)5. 运行结果 (8)三.回溯法解决批作业调度问题 (8)1.问题描述 (8)2.算法思想 (9)3. 部分算法实现 (10)4.运行结果 (10)5.时间复杂性分析 (11)四.作业调度算法比较 (11)五.课程学习总结 (12)摘要:在现代企业中,作业调度已成为提高资源利用率、从而提高企业运行效益的关键环节之一。
把各个作业分配到车间现有的设备上,并确定它们的先后次序,这是一项复杂的工作本文就作业调度排序问题进行了研究,通过对几个经典作业调度算法的分析讨论,总结了各个算法对作业调度的求解过程,并给出了每个算法的复杂度及性能分析。
关键词:作业调度;动态规划;贪心算法;回溯法;一.动态规划算法解决流水作业调度1、问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
2、算法分析直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
算法分析与设计程序操作实现 2大作业
算法分析与设计程序操作实现 2大作业实现操作者:08网本分组:6组每组1道大作业。
所占分值:30分(百分制)实现内容:1 循环赛日程表问题描述:设有n=2k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:①每个选手必须与其他n-1个选手各赛一次。
②每个选手一天只能参赛一次。
③循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。
在表中的第i行、第j列处填入第i个选手在第j天所遇到的选手。
其中1≤i≤n,1≤j≤n一1。
3-4个算法解决以上问题。
2 求3个数的最小公倍数问题描述:对任给的3个正整数,求它们的最小公倍数。
看完题目,读者一定会回忆起:最小公倍数的定义以及用短除法求这3个数的最小公倍数,甚至想到了最大公约数与最小公倍数的换算公式……。
其实,与问题相关的每一个经验和思路,都可能是解决这个问题的一种方法,下面就给出用这3种思路进行算法设计的过程。
3个算法解决以上问题。
3 猴子选大王问题描述:不同于自然界猴子选大王的方式,这里的猴子是这样选举它们的大王的:17只猴子围成一圈,从某只开始报数1—2—3—1—2—3—…,报“3”的猴子就被淘汰,游戏一直进行到圈内只剩一只猴子,它就是猴大王了。
通过解决这个问题将使我们进一步认识算法与数据结构的紧密关系。
3-4个算法解决以上问题。
4 最大子段和问题问题描述:给定n个整数(可能为负整数)a1,a2,a3,a4,a5,求形如:A i,a i+1,……,a j, i、j=1,…,n, i<=j的子段和的最大值。
当所有整数均为负整数时定义其最大子段和为0。
例如,当(a1,a2,a3,a4,a5 ,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为:∑==ji kka20j=2,j=4(下标从1开始)3-4个算法解决以上问题。
5 与利润无关的背包问题1背包问题1:在9件物品中选出3件使其质量和与500克之差的绝对值最小。
算法分析与设计大作业
int
main ( int argc, char *argv[] )
{
char * fixed = "600087000000905706040000080030002000004000690000410023500030170080090200001076300";
char r[MMAX][MMAX] = {{0}};
{
return row/3 * 3 + col/3;
}
void getnext(int *row, int *col, int* nrow, int* ncol){
if(*col ==8)
{
*ncol = 0;
*nrow = (*row)+1;
}பைடு நூலகம்
Else
{
*nrow = *row;
*ncol = (*col) +1;
{
for(col= 0; col<MMAX; col++)
{
if(fixmtr[row][col]!= 0)
{
r[row][(int)fixmtr[row][col]-1] = 1;
c[col][(int)fixmtr[row][col]-1] = 1;
b[getblockid(row,col)][(int)fixmtr[row][col]-1] = 1;
问题描述
在本次算法分析的课堂演示中,我做的是一个关于“裁切悖论——消失的正方形的PPT”,但是由于代码的问题,现在借鉴了同学的实验,写了一个关于数独算法的小题目。
如下图所示,有一个9*9的正方形,而正方形又分成了九个小正方形,现在已经在图示的正方形中给出了一些方格中的数字,要求将正方形中所有小方格的数字填充完,并且每个小正方形以及每行、每列,只能出现一次1~9这九个数字。
算法分析大作业
算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题目录1.动态规划解乘法表问题1.1问题描述------1.2算法设计思想------1.3设计方法------1.4源代码------1.5最终结果------2.动态规划解汽车加油行驶问题2.1问题描述------2.2算法设计思想------2.3设计方法------2.4源代码------2.5最终结果------3.总结1.动态规划解决乘法表问题1.1问题描述定义于字母表∑{a,b,c)上的乘法表如表所示:依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。
例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。
依乘法表,该表达式的值为a。
试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
1.2算法设计思想设常量a,b,c 分别为 1, 2 ,3 。
n 为字符串的长度。
设字符串的第 i 到第 j 位乘积为 a 的加括号法有result[i][j][a] 种,字符串的第 i 到第 j 位乘积为 b 的加括号法有result[i][j][b] 种,字符串的第 i 到第 j 位乘积为 c 的加括号法有 result[i][j][c] 种。
则原问题的解是:result[i][n][a] 。
设 k 为 i 到 j 中的某一个字符,则对于 k 从 i 到 j :result[i][j][a] += result[i][k][a] * result[k + 1][j][c] +result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a];result[i][j][b] += result[i][k][a] * result[k + 1][j][a] +result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b];result[i][j][c] += result[i][k][b] * result[k + 1][j][a] +result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c];输入:输入一个以a,b,c组成的任意一个字符串。
算法设计和分析大作业答案.docx
算法设计技术与方法大作业学院________________专业______________姓名__________________________学号_______________________任课老师多项式求值的四种方法1.问题背景分别实现多项式求值的四种运算,若针对不同规模的输入值a,各算法的运行时间,问题规模n 分别取10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000 时绘制四种算法运行时间的比较图。
2.程序设计分析题意可知,该题要用四种方法实现对多项式的求值计算,每种方法取从10-100000 不同的规模。
本文采用直接代入法和递归法。
而其中递归法分三类不同思路进行递归:①只3)=只-13) +时";。
, Q = 1, Q = Qx, P = P + a t Q;②P = a③3'3)=《3)工+。
"—,。
3.程序清单具体编程如下:clc;close all;clear all;n=[10 50 100 150 200 300 400 500 10000 20000 50000 100000];x=5;for i=l:12a=rand(l,(n(i)+l));%产生多项式,最高次幕为n(i)tic;forj=l:n(i); %直接代入法s(j)=a(j)*x A(j);endpl(i)=a(n(i)+l);for j=l:n(i);pl(i)=s ①+pl ⑴;endtl(i)=toc;tic;p2(i)=0;for j=l:(n(i)+l)p2(i)=p2⑴+a(j)*xWl); % 递归法1endt2(i)=toc;tic;p3(;i)=0;q=l;for j=2:(n (i)+l)q=q*x;p3(i)=p3(i)+a(j)*q; % 递归法2endt3(i)=toc;tic;p4 ①=0;for j=l:n(i);p4(i)=x*p4(i)+a(n⑴+l-j); % 递归法3endt4(i)=toc;endfigure(l);subplot(2,2,l);h=semilogx(n,t 1);set(h,'linestyle','-'「linewidth'』,'marker','s','color','g','markersize',6); xlabel(问题规模(n ));ylabel(运行时间(s),);title(方法一);grid on;subplot(2,2,2);h=semilogx(n,t2);set(h,'linestyle','-'「linewidth'』,'marker','s','color','b','markersize',6); xlabelC问题规模(n ),);ylabel(运行时间(s),);title(方法二);grid on;subplot(2,2,3);h=semilogx(n,t2);set(h,'linestyle','-'「linewidth'』,'marker','s','color',k,'markersize',6); xlabel(,问题规模(n ),);ylabel(运行时间(s),);title(方法三);grid on;subplot(2,2,4);h=semilogx(n,t2);set(h,'linestyle','-',Tinewidth', 1,'marker','s','color',、','markersize',6); xlabelC问题规模(n ),);ylabel(运行时间(s),);title(方法四);grid on;figure(2);g=semilogx(n,tl,'g+',n,t2,'bx',n,t3,'k*',n,t4,To‘);legend(方法一7方法二7方法三,,方法四);set(g,'linestyleV-','linewidth', 1,'markersize',8);xlabel('n=10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000'); ylabel。
算法分析与设计作业及参考答案
算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在什么情况下性能较好,什么情况下性能较差。
2、设计一个算法,用于在一个已排序的整数数组中查找特定元素。
要求算法的时间复杂度为 O(log n)。
3、比较贪心算法和动态规划算法的异同,并举例说明它们在实际问题中的应用。
参考答案一、冒泡排序算法的分析冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
1、时间复杂度最坏情况:数组完全逆序,需要进行 n(n 1) / 2 次比较和交换操作,时间复杂度为 O(n^2)。
最好情况:数组已经有序,不需要进行交换操作,只需要进行 n 1 次比较,时间复杂度为 O(n)。
平均情况:时间复杂度也为 O(n^2)。
2、空间复杂度冒泡排序只在交换元素时使用了临时变量,空间复杂度为 O(1),是一个原地排序算法。
3、性能分析性能较好的情况:当数组规模较小且接近有序时,冒泡排序的性能相对较好。
因为在这种情况下,比较和交换的次数相对较少。
性能较差的情况:当数组规模较大且无序程度较高时,冒泡排序的性能会非常差。
因为需要进行大量的比较和交换操作,时间消耗很大。
例如,对于数组 2, 1, 3, 5, 4,冒泡排序需要经过多次比较和交换才能将其排序为 1, 2, 3, 4, 5。
而对于已经有序的数组 1, 2, 3, 4, 5,冒泡排序只需要进行较少的比较操作就能确定数组已经有序。
二、在已排序数组中查找特定元素的算法设计对于在已排序的整数数组中查找特定元素,我们可以使用二分查找(Binary Search)算法。
二分查找的基本思想是:将数组从中间分成两部分,比较目标元素与中间元素的大小,如果目标元素小于中间元素,则在左半部分继续查找;如果目标元素大于中间元素,则在右半部分继续查找;如果目标元素等于中间元素,则查找成功。
北航研究生 算法设计与分析大作业一
一、请安排投资计划,使总的利润最大。
写出你所设的状态变量、决策变量、状态转移方程与递推关系式,和手工求解的详细步 骤及结果。
解:设k 表示前k 个项目;状态变量为k x ,表示能投资到前k 个项目中的金额为k x ;决策变量为}0|{ , k k k k k k x u u D D u ≤≤=∈,表示将k u 的金额投入到第k 个项目中;状态转移方程为k k k u x x +=+1,表示能投资到前k+1个项目的金额等于能投资到前k 个项目的金额,加上投资到第k+1个项目的金额;指标函数为)(P k k x ,表示将k x 投入到前k 个项目中所能获得的最大利润;设)(A k k x 为向第k 个项目投资k x 金额所能获得的利润。
则递推关系式为:⎪⎩⎪⎨⎧+-====-∈)}(A )({P max )(P 00 , 0)(P 1k k k k k D u kk k k k u u x x x k x k k 或① 当k=0或0=k x 时,总利润一定为0③ 当k=2时,8万元只投资第一、第二个项目,有若将0万投资第一个项目,8万投资第二个项目,利润为0+75=75若将1万投资第一个项目,7万投资第二个项目,利润为5+74=79 若将2万投资第一个项目,6万投资第二个项目,利润为15+73=88 若将3万投资第一个项目,5万投资第二个项目,利润为40+70=110 若将4万投资第一个项目,4万投资第二个项目,利润为80+60=140 若将5万投资第一个项目,3万投资第二个项目,利润为90+40=130 若将6万投资第一个项目,2万投资第二个项目,利润为95+15=110 若将7万投资第一个项目,1万投资第二个项目,利润为98+5=103 若将8万投资第一个项目,0万投资第二个项目,利润为100+0=100此时将4万元投资第一个项目,将剩余4万元投资第二个项目可获得最大利润140万元 同时计算出将2x 万元投资到前两个项目的获利情况如下表:④ 当k=3时,8万元同时投资第一、第二、第三个项目,有 若将0万投资前两个项目,8万投资第三个项目,利润为0+53=53若将1万投资前两个项目,7万投资第三个项目,利润为5+52=57若将2万投资前两个项目,6万投资第三个项目,利润为15+51=66若将3万投资前两个项目,5万投资第三个项目,利润为40+50=90若将4万投资前两个项目,4万投资第三个项目,利润为80+45=125若将5万投资前两个项目,3万投资第三个项目,利润为90+40=130若将6万投资前两个项目,2万投资第三个项目,利润为95+26=121若将7万投资前两个项目,1万投资第三个项目,利润为120+4=124若将8万投资前两个项目,0万投资第三个项目,利润为140+0=140此时将4万元投资第一个项目,将剩余4万元投资第二个项目,第三个项目投资0元,可获得最大利润140万元。
算法分析作业1_简单排序算法分析
排序算法复杂性分析一健鹏明欢我们重承诺,本作业的容均为原创,没有任何抄袭他人成果的行为,也不存在他人代写作业和程序的行为。
引用他人成果或公开资料的部分都已经按照正确的格式在参考文献中标出。
作者签字得分统计学生填写老师填写学号工作所占比例得分分别得分健20131401鹏20131400明欢20130711摘要本文通过三种简单排序-插入、冒泡和选择排序算法并运用C++语言编程实现,以计算简单排序算法复杂度。
首先,利用不同规模下随机产生的不同序列,计算三种排序方法下的元运算-比较、交换、移动的次数来定量刻画排序算法的时间复杂度,即序列规模与元运算次数的关系,得到三种算法的时间复杂度均为,这说明这三种排序算法具有相同时间复杂度,并且实现简单,所以也归为一类简单排序算法。
其次,采用统一规模下的不同排列顺序,主要是两个极端序-顺序、逆序的情况下分析三种算法的时间复杂度,得到算法的最好时间复杂度为,最坏时间复杂度为,反映出不同顺序的序列导致的排序算法时间复杂度的巨大差异性,并且插入、冒泡排序与选择排序之间的优劣也逐渐显现出来,主要是由于逆序对的数目导致交换次数变化的缘故。
最后,本文将作为其他排序算法的时间复杂度作为后续扩展部分,以待完善。
本文将围绕以下两个问题进行讨论分析:1)设计一个程序,程序的输入为n个(n必须要从键盘输入)0到10000的正整数(正整数可以是随机产生),输出为对这n个数进行从小到大排序后的序列。
排序方法分别使用插入排序、冒泡排序和选择排序。
2)以两个数比较、两个数交换、移动一个数为基本计算单位,测试你所编写的程序对于n=100,500,1000,2000四种输入规模的时间复杂度。
一、算法复杂度1.1算法复杂性算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。
一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。
算法分析作业
算法剖析演习题(一)一.选择题1.二分搜刮算法是应用( A )实现的算法.A.分治计谋B.动态计划法C.贪婪法D.回溯法2.下列不是动态计划算法根本步调的是( A ).A.找出最优解的性质B.构造最优解C.算出最优解D.界说最优解3.下列算法中平日以自底向上的方法求解最优解的是( B ).A.备忘录法B.动态计划法C.贪婪法D.回溯法4.权衡一个算法利害的尺度是( C ).A 运行速度快B 占用空间少C 时光庞杂度低D 代码短5.以下不成以应用分治法求解的是( D ).A 棋盘笼罩问题B 选择问题C 归并排序D 0/1背包问题6.实现轮回赛日程表应用的算法是( A ).A.分治计谋B.动态计划法C.贪婪法D.回溯法7.备忘录办法是那种算法的变形.( B )A.分治法B.动态计划法C.贪婪法D.回溯法8.最长公共子序列算法应用的算法是( B ).A.分支界线法B.动态计划法C.贪婪法D.回溯法9.实现棋盘笼罩算法应用的算法是( A ).A.分治法B.动态计划法C.贪婪法D.回溯法10. 矩阵连乘问题的算法可由(B)设计实现.A.分支界线算法B.动态计划算法C.贪婪算法D.回溯算法11.Strassen矩阵乘法是应用( A )实现的算法.A.分治计谋B.动态计划法C.贪婪法D.回溯法12.应用分治法求解不须要知足的前提是(A ).A 子问题必须是一样的B 子问题不克不及够反复C 子问题的解可以归并D 原问题和子问题应用雷同的办法解13.下列算法中不克不及解决0/1背包问题的是(A )A 贪婪法B 动态计划C 回溯法D 分支限界法14.实现归并排序应用的算法是( A ).A.分治计谋B.动态计划法C.贪婪法D.回溯法15.下列是动态计划算法根本要素的是( D ).A.界说最优解B.构造最优解C.算出最优解D.子问题重叠性质16.下列算法中平日以自底向下的方法求解最优解的是( B ).A.分治法B.动态计划法C.贪婪法D.回溯法17.归并排序算法是应用( A )实现的算法.A.分治计谋B.动态计划法C.贪婪法D.回溯法18.实现大整数的乘法是应用的算法( C ).A.贪婪法B.动态计划法C.分治计谋D.回溯法19. 实现最大子段和应用的算法是( B ).A.分治计谋B.动态计划法C.贪婪法D.回溯法20. 一个问题可用动态计划算法或贪婪算法求解的症结特点是问题的( B ).A.重叠子问题B.最优子构造性质C.贪婪选择性质D.界说最优解21.实现最长公共子序列应用的算法是( B ).A.分治计谋B.动态计划法C.贪婪法D.回溯法二.填空题时光庞杂性和空间庞杂性之分.2.程序是算法用某种程序设计说话的具体实现.3.算法的“肯定性”指的是构成算法的每条指令是清楚的,无歧义的.4.矩阵连乘问题的算法可由动态计划设计实现.5.算法是指解决问题的一种办法或一个进程.6.从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法.7.矩阵连乘问题的算法可由动态计划设计实现.8. 动态计划算法的根本思惟是将待求解问题分化成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解.9.算法是由若干条指令构成的有穷序列,且要知足输入.输出 .肯定性和有限性四条性质.10.大整数乘积算法是用分治法来设计的.11.快速排序算法是基于分治计谋的一种排序算法.12.动态计划算法的两个根本要素是. 性质和性质 .范围有关.划分的对称性 .15.出自于“均衡子问题”的思惟,平日分治法在朋分原问题,形成若干子问题时,这些子问题的范围都大致雷同.16.应用二分搜刮算法在n个有序元素表中搜刮一个特定元素,在最佳情况下,搜刮的时光庞杂性为O(),在最坏情况下,搜刮的时光庞杂性为O(logn).17.已知一个分治算法消耗的盘算时光T(n),T(n)知足如下递归方程:解得此递归方可得T(n)= O(nlogn).18.动态计划算法有一个变形办法备忘录办法.这种办法不合于动态计划算法“自底向上”的填充偏向,而是“自顶向下”的递归偏向,为每个解过的子问题树立了备忘录以备须要时检讨,同样也可防止雷同子问题的反复求解.19.递归的二分查找算法在divide阶段所花的时光是O(1),conquer阶段所花的时光是T(n/2) ,算法的时光庞杂度是O( log n).20.用动态计划算法盘算矩阵连乘问题的最优值所花的时光是O(n3), 子问题空间大小是O(n2) .21.一个算法的好坏可以用(时光庞杂度)与(空间庞杂度)与来权衡.22.直接或间接地挪用自身的算法称为(递归算法).23.q 记号在算法庞杂性的暗示法中暗示(渐进确界或紧致界).24.在分治法中,使子问题范围大致相等的做法是出自一种(均衡子问题)的思惟.25.动态计划算法实用于解(具有某种最优性质)问题.26.最优子构造性质的寄义是(问题的最优解包含其子问题的最优解).27.按照符号O的界说O(f)+O(g)等于O(max{f(n),g(n)}).28.二分搜刮技巧是应用(分治)计谋的典范例子.29.动态计划算法中,平日不合子问题的个数随问题范围呈(多项式)级增加.30.(最优子构造性质)和(子问题重叠性质)是采取动态计划算法的两个根本要素.三.算法填空1.最大子段和: 动态计划算法int MaxSum(int n, int a[]){int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j]for(int j=1; j<=n; j++) {if(b>0) b+=a[j] ;else b=a[i]; //一旦某个区段和为负,则从下一个地位累和if (b>sum) sum=b ;}return sum;}template<class Type>void QuickSort (Type a[], int p, int r){if (p<r) {int q=Partition(a,p,r);QuickSort(a,p,q-1); //对左半段排序QuickSort(a,q+1,r); //对右半段排序}}四.简答题1.写出下列庞杂性函数的偏序关系(即按照渐进阶从低到高排序):2.将所给定序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分离求出这两段的最大子段和,则a[1:n]的最大子段和有哪三种情况?3.请解释动态计划办法为什么须要最优子构造性质.最优子构造性质是指大问题的最优解包含子问题的最优解. 动态计划办法是自底向上盘算各个子问题的最优解,即先盘算子问题的最优解,然后再应用子问题的最优解构造大问题的最优解,是以须要最优子构造4.设计动态计划算法的重要步调是怎么的?请简述.参考解答:(1)找出最优解的性质,并刻划其构造特点.(6分) (2)递归地界说最优值.(3)以自底向上的方法盘算出最优值. (4)依据盘算最优值时得到的信息,构造最优解.5.分治法所能解决的问题一般具有哪几个特点?请简述.参考解答:(1)该问题的范围缩小到必定的程度就可以轻易地解决;(6分) (2)该问题可以分化为若干个范围较小的雷同问题,即该问题具有最优子构造性质;(3)应用该问题分化出的子问题的解可以归并为该问题的解;(4)原问题所分化出的各个子问题是互相自力的,即子问题之间不包含公共的子问题.6.算法的要特点是什么?参考解答:肯定性.可实现性.输入.输出.有穷性7、算法剖析的目标是什么?参考解答:剖析算法占用盘算机资本的情况,对算法做出比较和评价,设计出额更好的算法.8.算法的时光庞杂性与问题的什么身分相干?参考解答:算法的时光庞杂性与问题的范围相干,是问题大小n的函数.9.算法的渐进时光庞杂性的寄义?参考解答:当问题的范围n趋势无限大时,影响算法效力的重要身分是T(n)的数目级,而其他身分仅是使时光庞杂度相差常数倍,是以可以用T(n)的数目级(阶)评价算法.时光庞杂度T(n)的数目级(阶)称为渐进时光庞杂性.10简述渐进时光庞杂性上界的界说.参考解答:T(n)是某算法的时光庞杂性函数,f(n)是一简略函数,消失正整数No和C,n〉No,有T(n)<f(n),这种关系记作T(n)=O(f(n)).11快速排序算法最坏情况下须要若干次比较运算?参考解答:最坏情况下快速排序退化成冒泡排序,须要比较n2次.12阐述归并排序的分治思绪.参考解答:讲数组一分为二,分离对每个聚集单独排序,然后将已排序的两个序列归并成一个含n个元素的分好类的序列.假如朋分后子问题还很大,则持续分治,直到一个元素.13快速排序的根本思惟是什么.参考解答:快速排序的根本思惟是在待排序的N个记载中随意率性取一个记载,把该记载放在最终地位后,数据序列被此记载分成两部分.所有症结字比该记载症结字小的放在前一部分,所有比它大的放置在后一部分,并把该记载排在这两部分的中央,这个进程称作一次快速排序.之后反复上述进程,直到每一部分内只有一个记载为止.14分治法的根本思惟是什么?将一个范围为N的问题分化为K个范围较小的子问题,这些子问题互相自力且与原问题性质雷同.求出子问题的解,就可得到原问题的解.即一种分目标完成程序算法,简略问题可用二分法完成.15设计动态计划算法的重要步调?参考解答:(1)找出最优解的性质,并刻划其构造特点.(6分) (2)递归地界说最优值.(3)以自底向上的方法盘算出最优值. (4)依据盘算最优值时得到的信息,构造最优解.16分治法与动态计划法的异同配合点:将待求解的问题分化成若干子问题,先求解子问题,然后再从这些子问题的解得到原问题的解.不合点:1.合适于用动态计划法求解的问题,分化得到的各子问题往往不是互相自力的;而分治法中子问题互相自力.2.动态计划法用表保管已求解过的子问题的解,再次碰着同样的子问题时不必从新求解,而只需查询答案,故可获得多项式级时光庞杂度,效力较高;而分治法中对于每次消失的子问题均求解,导致同样的子问题被反复求解,故产生指数增加的时光庞杂度,效力较低.17分治法所能解决的问题一般具有的几个特点?参考解答:(1)该问题的范围缩小到必定的程度就可以轻易地解决;(6分) (2)该问题可以分化为若干个范围较小的雷同问题,即该问题具有最优子构造性质;(3) 应用该问题分化出的子问题的解可以归并为该问题的解;(4)原问题所分化出的各个子问题是互相自力的,即子问题之间不包含公共的子问题.五.算法设计题1.【最长上升子序列问题】—— 提醒:此题可采取动态计划算法实现对于给定的一个序列12(,,,)N a a a ,11000N ≤≤.我们可以得到一些递增上升的子序列12(,,,)i i iK a a a ,这里121K i i i N ≤<<<≤.比方,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等.这些子序列中最长的长度是4,比方剂序列(1, 3, 5, 8).你的义务:就是对于给定的序列,求出最长上升子序列的长度.请求写出你设计的算法思惟及递推函数的公式表达..2.【Gray码构造问题】——提醒:此题可采取分治递归算法实现问题描写:“格雷码”是一个长度为n2的序列,知足:(a)每个元素都是长度为n比特的串(b)序列中无雷同元素(c)持续的两个元素正好只有1个比特不合例如:n=2时,格雷码为{00,01,11,10}.Gray码是一种编码,这种编码可以防止在读取时,因各数据位时序上的差别造成的误读.格雷码在工程上有普遍应用.但格雷码便利于运算,请你设计一种构造办法,输入长度序列n,输出格雷码(你只要做出一种构造计划即可,格雷码其实不独一).3.如今有8位运发动要进行网球轮回赛,要设计一个知足以下请求的比赛日程表:(1)每个选手必须与其他选手各赛一次;(2)每个选手一天只能赛一次;(3)轮回赛一共进行n – 1天.请应用分治法的思惟,给这8位运发动设计一个合理的比赛日程. 4.对于矩阵连乘所需起码数乘次数问题,其递归关系式为:个中m[i,j]为盘算矩阵连乘Ai…Aj所需的起码数乘次数,p i-1为矩阵Ai的行,p为矩阵Ai的列.现有四个矩阵,个中各矩阵维数分i离为:请依据以上的递归关系,盘算出矩阵连乘积A1A2A3A4所须要的起码数乘次数.5.有如许一类特别0-1背包问题:可选物品重量越轻的物品价值越高.n=6,c=20,P=(4,8,15,1,6,3),W=(5,3,2,10,4,8).个中n为物品个数,c为背包载重量,P暗示物品的价值,W暗示物品的重量.请问对于此0-1背包问题,应若何选择放进去的物品,才干使到放进背包的物品总价值最大,能获得的最大总价值若干?6.归并排序算法对下列实例排序,写出算法履行进程.A=(48,12,61,3,5,19,32,7)7.规矩证实: O(f(n))+O(g(n)) = O(max{f(n),g(n)})8.给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,返回其在数组中的地位,假如未找到返回-1.写出二分搜刮的算法,并剖析当时光庞杂度.9.应用分治算法写出归并排序的算法,并剖析当时光庞杂度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析大作业动态规划方法解乘法表问题和汽车加油行驶问题目录1.动态规划解乘法表问题1.1问题描述------1.2算法设计思想------1.3设计方法------1.4源代码------1.5最终结果------2.动态规划解汽车加油行驶问题2.1问题描述------2.2算法设计思想------2.3设计方法------2.4源代码------2.5最终结果------3.总结1.动态规划解决乘法表问题1.1问题描述定义于字母表∑{a,b,c)上的乘法表如表所示:依此乘法表,对任一定义于∑上的字符串,适当加括号表达式后得到一个表达式。
例如,对于字符串x=bbbba,它的一个加括号表达式为(b(bb))(ba)。
依乘法表,该表达式的值为a。
试设计一个动态规划算法,对任一定义于∑上的字符串x=x1x2…xn,计算有多少种不同的加括号方式,使由x导出的加括号表达式的值为a。
1.2算法设计思想设常量a,b,c 分别为 1, 2 ,3 。
n 为字符串的长度。
设字符串的第 i 到第 j 位乘积为 a 的加括号法有result[i][j][a] 种,字符串的第 i 到第 j 位乘积为 b 的加括号法有result[i][j][b] 种,字符串的第 i 到第 j 位乘积为 c 的加括号法有result[i][j][c] 种。
则原问题的解是:result[i][n][a] 。
设 k 为 i 到 j 中的某一个字符,则对于 k 从 i 到 j :result[i][j][a] += result[i][k][a] * result[k + 1][j][c] + result[i][k][b] * result[k + 1][j][c] + result[i][k][c] * result[k + 1][j][a];result[i][j][b] += result[i][k][a] * result[k + 1][j][a] + result[i][k][a] * result[k + 1][j][b] + result[i][k][b] * result[k + 1][j][b];result[i][j][c] += result[i][k][b] * result[k + 1][j][a] + result[i][k][c] * result[k + 1][j][b] + result[i][k][c] * result[k + 1][j][c];输入:输入一个以a,b,c组成的任意一个字符串。
输出:计算出的加括号方式数。
1.3设计方法乘法表问题直观理解就是通过加括号使得最终运算结果为a,该问题与矩阵连乘问题类似,矩阵连乘是每一次加括号选择运算量最小的,写成数学表达式有:而乘法表问题则是计算所有加括号运算结果为a的情况数,并不要求输出加括号方式。
那么可以从乘法的最小单元两个符号相乘的所有可能开始,接着在两个符号相乘的基础上计算三个符号相乘的所有可能。
直到计算N长度的符号1-N的所有可能。
可以定义一个三维数组a[n][n][3],n为输入字符串的长度,a[i][j][0]为从字符串中第i个元素到第j个元素的子串表达式值为a的加括号方式数,a[i][j][1]为从字符串中第i个元素到第j个元素的子串表达式值为b的加括号方式数,a[i][j][2]为从字符串中第i个元素到第j个元素的子串表达式值为c的加括号方式数。
由乘法表的定义则可知啊a[i][j][0]=(对k求和,k从i到j-1)a[i][k][0]*a[i][k+1][2]+a[i][k][1]*a[i][k+1][2]+a[i][k][2]*a[i][k+1][1];同理可得到a[i][j][1]和a[i][j][2]。
同时由上面的表达式可知,要计算a[i][j][],需先计算a[i][k] []和a[i][k+1][],这里k从i到j-1,故a[i][j][]可采取如下的计算次序1.4源代码#include "iostream"#include "algorithm"#include "fstream"using namespace std;/*f[i][j][0] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为af[i][j][1] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为bf[i][j][2] 表示在ch[i]~ch[j]之间以某种方式加括号后,结果为ca = a*c || b*c || c*ab = a*a || a*b || b*bc = b*a || c*b || c*c */int f[50][50][3];char chars[3] = {'a', 'b', 'c'};int mul(int n, char ch[]){for(int i=0; i<n; i++)for(int k=0; k<3; k++)f[i][i][k] = (ch[i] == chars[k] ? 1: 0);/*a = a*c || b*c || c*ab = a*a || a*b || b*bc = b*a || c*b || c*c*/for(int r=1; r<n; r++) //规模for(i=0; i<n-r; i++) //区间左端点{int j = i + r; //区间右端点for(int k=i; k<j; k++) //断点{f[i][j][0] += f[i][k][0]*f[k+1][j][2] + f[i][k][1]*f[k+1][j][2] + f[i][k][2]*f[k+1][j][0];f[i][j][1] += f[i][k][0]*f[k+1][j][0] + f[i][k][0]*f[k+1][j][1] + f[i][k][1]*f[k+1][j][1];f[i][j][2] += f[i][k][1]*f[k+1][j][0] + f[i][k][2]*f[k+1][j][1] + f[i][k][2]*f[k+1][j][2];}}return f[0][n-1][0];}int main(){ifstream fin("mul.txt");cout << "输入字符串:";char ch[100];fin >> ch; cout << ch;int n = strlen(ch);cout << "\n结果为a的加括号方式为:" << mul(n, ch) << endl;fin.close();return 0;}1.5最终结果2.动态规划解决汽车加油行驶问题2.1问题描述给定一个N*N的方形网络,设其左上角为起点○,坐标为(1,1),X轴向右为正,Y轴向下为正,每个方格边长为1。
一辆汽车从起点○出发驶向右下角终点,其坐标为(M,N)。
在若干网格交叉点处,设置了油库,可供汽车在行驶途中,可供汽车在行驶途中加油。
汽车在行驶过程中应遵守如下规则:(1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。
出发时汽车已装满油,在起点与终点处不设油库。
(2)当汽车行驶经过一条网格边时,若其X坐标或Y坐标减小,则应付费用B,否则免付费用。
(3)汽车在行驶过程中遇油库则应加满油并付加油费用A。
(4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)。
(5)(1)~(4)中的各数N,K,A,B,C均为正整数。
2.2算法设计思想这个题目,应该说是刚开始的时候被他给吓到了,只是想着如何去把所有的条件构造起来,然后使用网络流的方式来解决问题!但是,如果真的是很冷静下来好好地思考这道题目,就会发现如果没有那些限制条件,就是一个求解最长路的题目,这样就可以直接使用SPFA来解决这个问题!关键就是在于这个每次最多只能走K个网格边,这样就是限制了活动的范围,使得有的边无法扩展!因此可以考虑使用这个分层思想的最短路问题!就是通过将每一个点进行拆分,这样,就是相当于一种分类讨论的方式!而分类讨论了之后,就知道哪些边是可以扩展的,哪些边是不能扩展的!关键点就是在于该如何选取变量来分层,这就是因情况而异了!像这道题目之中,就是通过油量的多少来扩展边的!分层思想,说穿了其实就是相当于这个动态规划之中的增加变量的方式来确定状态一样,他们的实质其实都是一样的!2.3设计方法采用的是动态规划的思想来解题,用备忘录的方法进行递归,递归的式子后面写出.不能直接以汽车行驶的费用为目标来进行动态规划,因为最优子结构性质得不到证明.所以必须把油量和费用一起考虑,作为动态规划的对象,此时就有了最优子结构性质.最优子结构性质的证明证明:假设路径M是从起点◎到终点▲的一条最小费用路径,P(x,y)是M经过的一个点(非加油站),且油量和费用为(g,c),现假设有一条新路径Q从起点◎到点P(x,y),使得其在P(x,y)点的油量和费用为(g,c'),其中c'备忘录递归刚开始的时候为每个网格点P(x,y)建立一个记录,初始化时,为该记录存入一个特殊值W,表示汽车未行驶过.那么在汽车行驶过程中,对每个待求的汽车最小费用值COST,先查看其相应的记录项C,如果存储的是初始值W,那么表示这个点P(x,y)是第一次遇到,此时计算出该点的最小费用值,并保存在其相应的记录项中,以备以后查看.若记录项C中存储的不是初始值W,那么表示该问题已经求解过了,其相应的记录项中存储的就是该点的最小费用值COST,此时要取出记录项C的值跟最新的计算出的COST进行比较,取其最小的那个数存入到C中.依此建立记录项C的值,当程序递归完成时,我们也得到了汽车行驶到(n,n)的最小费用值COST.2.4源代码#include "iostream"#include "algorithm"#include "fstream"using namespace std;#define INF 10000/*f[i][j][0]表示汽车从网格点(1,1)行驶至网格点(i,j)所需的最少费用f[i][j][1]表示汽车行驶至网格点(i,j)还能行驶的网格边数s[i][0]表示x轴方向s[i][1]表示y轴方向s[i][2]表示行驶费用f[i][j][0] = min{f[ i+s[k][0] ][ [j+s[k][1] ][0] + s[k][2]} f[i][j][1] = f[ i+s[k][0] ][ [j+s[k][1] ][1] - 1;f[1][1][0] = 0f[1][1][1] = Kf[i][j][0] = f[i][j][0] + A , f[i][j][1] = K 如果(i, j)是油库f[i][j][0] = f[i][j][0] + C + A, f[i][j][1] = K (i, j)不是油库,且f[i][j][1] = 0*/int N; //方形网络规模int A; //汽车在行驶过程中遇到油库应加满油并付加油费Aint C; //在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)int B; //当汽车行驶经过一条网格边时,如果其x坐标或y坐标减少,应付费用Bint K; //装满油后,还能行驶K条边int f[50][50][2];int s[4][3] = {{-1,0,0},{0,-1,0},{1,0,B},{0,1,B}};int a[50][50]; //方形网络int dyna(){int i, j, k;for (i=1;i<=N;i++){for (j=1;j<=N;j++){f[i][j][0]=INF;f[i][j][1]=K;}}f[1][1][0] = 0;f[1][1][1] = K;int count = 1;int tx, ty;while(count){count = 0;for(i=1; i<=N; i++){for(int j=1; j<=N; j++){if(i==1 && j==1)continue;int minStep = INF;int minDstep;int step, dstep;for(k=0; k<4; k++) //可走的四个方向{tx = i + s[k][0];ty = j + s[k][1];if(tx<1 || ty<1 || tx>N || ty>N) //如果出界continue;step = f[tx][ty][0] + s[k][2];dstep = f[tx][ty][1] - 1;if(a[i][j] == 1) //如果是油库{step += A;dstep = K;}if(a[i][j]==0 && dstep == 0 && (i!=N||j!=N)) //如果不是油库,且油已经用完{step += A + C;dstep = K;}if(step < minStep) //可以走{minStep = step;minDstep = dstep;}}if(f[i][j][0] > minStep) //如果有更优解 {count++;f[i][j][0] = minStep;f[i][j][1] = minDstep;}}}}return f[N][N][0];}int main(){ifstream fin("car.txt");cout << "输入方格规模:";fin >> N; cout << N;cout << "\n输入装满油后能行驶的网格边数:";fin >> K; cout << K;cout << "\n输入加油费:";fin >> A; cout << A;cout << "\n输入坐标减少时应付的费用:";fin >> B; cout << B; s[2][2] = s[3][2] = B;cout << "\n输入增设油库费用:";fin >> C; cout << C;cout << "\n输入方形网络:\n";for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin >> a[i][j];cout << a[i][j] << " ";}cout << endl;}cout << "最优行驶路线所需的费用为:" << dyna() << endl;fin.close();return 0;}2.5最终结果3.总结动态规划(Dynamic Programming, DP)思想启发于分治算法的思想,也是将复杂问题化解若干子问题,先求解小问题,再根据小问题的解得到原问题的解。