算法设计与分析大作业
- 格式:doc
- 大小:15.50 KB
- 文档页数:2
算法分析与设计大作业摘要:本文以算法分析与设计为主题,对算法的概念、分析和设计进行了探讨。
首先介绍了算法的概念和基本特征,其次分析了算法的效率和复杂度,并介绍了常用的算法复杂度表示方法。
然后,通过实例分析了几种常用的排序算法的性能与复杂度,并对它们进行了比较。
最后,总结了算法分析与设计的重要性,并提出了进一步研究的方向。
一、引言随着计算机技术的快速发展,算法分析与设计成为计算机领域中的重要研究方向。
算法是指解决特定问题的具体步骤和方法,是计算机科学的核心和基础。
算法的效率和复杂度对计算机的性能和运行时间有着直接的影响,因此算法的分析和设计非常重要。
二、算法的概念和特征算法是指在有限的时间内解决特定问题的一种方法。
它具有以下特征:输入、输出、确定性、有穷性和可行性。
输入是指算法接受的问题的数据或信息,输出是指算法求解得到的问题的解。
确定性是指算法在任何情况下都能够得到相同的结果。
有穷性是指算法在执行有限的步骤后能够终止。
可行性是指算法的每一步都是可行的,即能够被计算机执行。
三、算法的效率和复杂度算法的效率是指算法解决问题所需要的时间和空间资源的多少。
算法的复杂度是用来描述算法执行过程中所需要的资源的多少。
常用的算法复杂度表示方法有时间复杂度和空间复杂度。
时间复杂度表示算法的执行时间与输入规模之间的关系,用大写O表示。
空间复杂度表示算法所需的空间资源与输入规模之间的关系,用大写S表示。
四、常用的排序算法及性能与复杂度分析1.插入排序插入排序是一种简单直观的排序算法。
它的基本思想是将未排序的元素逐个插入到已排序的序列中。
插入的过程中,需要比较和移动元素的次数与未排序序列中的元素个数相关,因此时间复杂度为O(n^2)。
空间复杂度为O(1)。
2.冒泡排序冒泡排序是一种重复比较相邻元素并交换位置的排序算法。
它的基本思想是两两比较相邻元素,如果顺序错误则交换位置。
冒泡的过程中,需要进行n-1次的比较和交换操作,因此时间复杂度为O(n^2)。
算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。
以下是一些典型的算法设计与分析习题及其答案。
习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。
答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。
这个过程会不断重复,直到找到目标值或搜索范围为空。
```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。
答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。
```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。
算法分析与设计大作业班级: 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)。
《算法分析与设计》作业( 一)本课程作业由两部分组成。
第一部分为”客观题部分”, 由15个选择题组成, 每题1分, 共15分。
第二部分为”主观题部分”,由简答题和论述题组成, 共15分。
作业总分30分, 将作为平时成绩记入课程总成绩。
客观题部分:一、选择题( 每题1分, 共15题)1、递归算法: ( C )A、直接调用自身B、间接调用自身C、直接或间接调用自身 D、不调用自身2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题, 这些子问题: ( D )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同3、备忘录方法的递归方式是:( C )A、自顶向下B、自底向上C、和动态规划算法相同D、非递归的4、回溯法的求解目标是找出解空间中满足约束条件的:( A )A、所有解B、一些解C、极大解D、极小解5、贪心算法和动态规划算法共有特点是: ( A )A、最优子结构B、重叠子问题C、贪心选择D、形函数6、哈夫曼编码是: ( B)A、定长编码B、变长编码C、随机编码D、定长或变长编码7、多机调度的贪心策略是: ( A)A、最长处理时间作业优先B、最短处理时间作业优先C、随机调度D、最优调度8、程序能够不满足如下性质: ( D )A、零个或多个外部输入B、至少一个输出C、指令的确定性D、指令的有限性9、用分治法设计出的程序一般是: ( A )A、递归算法B、动态规划算法C、贪心算法D、回溯法10、采用动态规划算法分解得到的子问题:( C )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同11、回溯法搜索解空间的方法是: ( A )A、深度优先B、广度优先C、最小耗费优先D、随机搜索12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法: ( C )A、所需时间变化B、一定找到解C、找不到所需的解D、性能变差13、贪心算法能得到: ( C )A、全局最优解B、 0-1背包问题的解C、背包问题的解 D、无解14、能求解单源最短路径问题的算法是: ( A )A、分支限界法B、动态规划C、线形规划D、蒙特卡罗算法15、快速排序算法和线性时间选择算法的随机化版本是:( A )A、舍伍德算法B、蒙特卡罗算法C、拉斯维加斯算法D、数值随机化算法主观题部分:二、写出下列程序的答案( 每题2.5分, 共2题)1、请写出批处理作业调度的回溯算法。
算法设计与分析作业姓名:学号:专业:习题一1-1函数的渐进表达式3n2+10n=O(n2);n2/10+2n=O(2n);21+1/n=O(1);logn3=O(logn);10log3n=O(n)1-2O(1)和O(2)的区别分析与解答:根据符号O的定义可知O(1)=O(2).用O(1)和O(2)表示同一个函数时,差别仅在于其中的常数因子。
1-3按渐进阶排列表达式分析与解答:按渐进阶从低到高,函数排列顺序如下:O(2)<O(logn)<O(n2/3)<O(20n)<O(4n2)<O(3n)<O(n!)习题二算法分析题2-2 7个二分搜索算法分析与解答:(1)与主教材中的算法BinarySearch相比,数组段左、右游标left和right的调整不正确,导致陷入死循环。
(2)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(3)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(4)数组段左、右游标left和right的调整不正确,导致陷入死循环。
(5)算法正确,且当数组中有重复元素时,返回满足条件的最右元素。
(6)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(7)数组段左、右游标left和right的调整不正确,导致当x=a[0]时陷入死循环。
2-26修改快速排序算法,使它在最坏情况下的计算时间为O(nlogn).分析与解答:从一个无序的序列中随机取出一个值q做为支点,然后把大于q的放到一边,小于q的放到q的另一边,然后再以q为分界点,分别对q的两边进行排序(快排时直接再对q两边重新取支点,整理,再取支点,...直到支点两旁都有序。
也就是支点两旁只有一个数时)#include <stdio.h>#include <stdlib.h>int Qsort(int p[],int beg,int end){if(beg+1>=end)return 0;//退出递归int low,hight,q;low=beg;hight=end;q=p[low];//q为支点,其实q可以为随机数。
《算法设计与分析大作业报告》班级:学号:姓名:分治法大作业报告问题陈述:编程实现归并排序算法和快速排序算法,输出排序结果。
输入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 中的每一个点的距离:这个问题是此问题的关键。
算法设计与分析作业作业一:给一个数组,用冒泡排序、选择排序、合并排序与快速排序四种方法实现过程且比较,并把排序时间显示出来。
冒泡排序:原理:将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。
在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。
所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。
代码:package maopao;public class maopao{public void paixu(){int array[] = {1,3,-2,0,8,7,-1,13,63,-20,120};long start = System.nanoTime();//开始时间for(int i = 0;i<array.length;i++){for(int j = i+1;j<array.length;j++){if(array[i] < array[j]){int tempt = array[i];array[i] = array[j];array[j] = tempt;}}}for(int i = 0 ; i< array.length; i++){System.out.println(" "+array[i]+" ");}long end = System.nanoTime();//结束时间System.out.println("所花费的时间为: "+(end-start)+"纳秒" );//运行时间}public static void main(String[] args){maopao m = new maopao();m.paixu();}}运行结果:选择排序:原理:对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。