算法实验二
算法实验报告
算法实验报告算法实验报告引言:算法是计算机科学的核心内容之一,它是解决问题的方法和步骤的描述。
算法的设计和分析是计算机科学与工程中的重要研究方向之一。
本实验旨在通过对算法的实际应用和实验验证,深入理解算法的性能和效果。
实验一:排序算法的比较在本实验中,我们将比较三种常见的排序算法:冒泡排序、插入排序和快速排序。
我们将通过对不同规模的随机数组进行排序,并记录每种算法所需的时间和比较次数,以评估它们的性能。
实验结果显示,快速排序是最快的排序算法,其时间复杂度为O(nlogn),比较次数也相对较少。
插入排序的时间复杂度为O(n^2),比较次数较多,但对于小规模的数组排序效果较好。
而冒泡排序的时间复杂度也为O(n^2),但比较次数更多,效率相对较低。
实验二:图的最短路径算法在图的最短路径问题中,我们将比较Dijkstra算法和Floyd-Warshall算法的效率和准确性。
我们将使用一个带权有向图,并计算从一个顶点到其他所有顶点的最短路径。
实验结果表明,Dijkstra算法适用于单源最短路径问题,其时间复杂度为O(V^2),其中V为顶点数。
而Floyd-Warshall算法适用于多源最短路径问题,其时间复杂度为O(V^3)。
两种算法在准确性上没有明显差异,但在处理大规模图时,Floyd-Warshall算法的效率较低。
实验三:动态规划算法动态规划是一种通过将问题分解成子问题并记录子问题的解来解决复杂问题的方法。
在本实验中,我们将比较两种动态规划算法:0-1背包问题和最长公共子序列问题。
实验结果显示,0-1背包问题的动态规划算法可以有效地找到最优解,其时间复杂度为O(nW),其中n为物品个数,W为背包容量。
最长公共子序列问题的动态规划算法可以找到两个序列的最长公共子序列,其时间复杂度为O(mn),其中m和n分别为两个序列的长度。
结论:通过本次实验,我们对不同算法的性能和效果有了更深入的了解。
排序算法中,快速排序是最快且效率最高的;在图的最短路径问题中,Dijkstra算法和Floyd-Warshall算法分别适用于不同的场景;动态规划算法可以解决复杂的问题,并找到最优解。
实验二时间片轮转RR进程调度算法
实验二时间片轮转R R进程调度算法The document was finally revised on 2021实验二时间片轮转RR进程调度算法一:需求分析程序的设计的任务和目的:设计程序模拟进程的时间片轮转RR调度过程。
假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。
分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
(1)输入的形式和输入值的范围为避免测试时频繁输入数据,将测试数据放在txt文件中采用读文件方法读取数据。
在同目录下的txt文件中输入数据,第一行为进程到达时间,中间用空格隔开,第二行为进程服务时间,不同进程的服务时间之间用空格隔开。
(2) 输出的形式输出每个时刻的进程运行状态,并且输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。
(详见运行截图)(3) 程序所能达到的功能;能够模拟进程的时间片轮转RR调度过程,可以输入时间片大小,然后采用时间片轮转RR进程调度算法进行调度,可以模拟调度过程,输出每个时刻的进程运行状态,另外也实现了输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
详见运行结果截图2、概要设计使用链表创建队列,用链表方法实现时间片轮转调度。
主要有主函数,时间片轮转调度函数void RR(int*ArrivalTime,int*ServiceTime,int n,int q,LinkQueue &Q)和输出函数void print(int n,int array[]),void print(int n,double array[]);三:详细设计程序主要设计思想:(1)创建进程,使用链表的方法,链表中的每个结点相当于一个进程。
实验二时间片轮转算法实验报告
实验二时间片轮转算法实验报告一、实验目的本次实验的主要目的是了解时间片轮转算法的工作原理,学习如何使用时间片轮转算法进行进程调度,并了解时间片大小对进程调度的影响。
二、实验原理时间片轮转算法是一种公平的进程调度算法,它采用循环队列的形式,将所有需要运行的进程按照到达时间排序,并将它们按照轮转的方式依次执行,每个进程在一个时间片内执行一定的时间(时间片大小),然后被暂停并放在队列的末尾等待下一次调度。
当一个进程的时间片用完后,它会被暂停并放在队列的最后,而在这个时间片内没有执行完的进程会被暂停并放到队列的开头,以便继续下一轮的运行。
这样一直循环下去,直到所有进程都运行完毕。
三、实验步骤1.设定进程数量和时间片大小。
2.定义进程结构体,包括进程ID、到达时间、服务时间、剩余时间等信息。
3.初始化所有进程,并按照到达时间排序。
4.创建一个循环队列,并将所有已到达的进程入队。
5.按照时间片大小循环执行以下步骤:a.从队列中取出一个进程,执行一次时间片大小的时间。
b.更新队列中所有进程的剩余时间。
c.如果剩余时间大于0,将进程放入队尾。
d.如果剩余时间等于0,表示进程执行完毕,将其从队列中移除。
e.输出每个时间片的调度情况。
6.统计平均等待时间和平均周转时间,并输出结果。
四、实验结果本次实验我们设置了4个进程,并且时间片大小为3、以下是每个时间片的调度情况:时间片1:进程1执行,剩余时间为2时间片2:进程2执行,剩余时间为4时间片3:进程3执行,剩余时间为5时间片4:进程1执行,剩余时间为1时间片5:进程2执行,剩余时间为3时间片6:进程3执行,剩余时间为4时间片7:进程4执行,剩余时间为2时间片8:进程1执行,剩余时间为0,进程1执行完毕时间片9:进程2执行,剩余时间为2时间片10:进程3执行,剩余时间为3时间片11:进程4执行,剩余时间为1时间片12:进程2执行,剩余时间为1时间片13:进程3执行,剩余时间为2时间片14:进程4执行,剩余时间为0,进程4执行完毕时间片15:进程2执行,剩余时间为0,进程2执行完毕时间片16:进程3执行,剩余时间为1时间片17:进程3执行,剩余时间为0根据以上调度情况,我们可以计算出平均等待时间和平均周转时间。
算法设计与分析实验2
算法设计与分析实验21. 实验背景算法设计与分析是计算机科学中重要的研究方向,涉及到算法的设计、分析和实现。
本次实验旨在帮助学生进一步理解和掌握常见的算法设计与分析方法,通过实践操作加深对算法原理的理解。
2. 实验目的本次实验的主要目的如下:- 理解动态规划算法设计思想;- 学习并掌握动态规划算法的实现方法; - 熟悉动态规划算法的时间复杂度分析方法。
3. 实验内容本次实验的主要内容是实现一个动态规划算法,并分析它的时间复杂度。
3.1 动态规划算法介绍动态规划算法是一种将问题分解成子问题并逐个求解的方法。
它通过存储子问题的解来避免重复计算,从而提高算法的效率。
动态规划算法通常采用自底向上的方式来求解问题,即先求解小规模的子问题,再逐步扩大规模,直到解决原始问题。
3.2 实现一个动态规划算法在本次实验中,我们将实现一个动态规划算法来解决一个具体的问题。
具体步骤如下: 1. 确定子问题:将原问题分解为子问题; 2. 确定状态转移方程:定义一个状态转移方程,用于表示子问题与原问题之间的关系; 3. 确定边界条件:确定子问题的边界条件,即最简单的情况下的解; 4. 自底向上求解:根据状态转移方程和边界条件,逐步求解子问题,最终得到原问题的解。
3.3 时间复杂度分析完成动态规划算法的实现后,我们需要对算法的时间复杂度进行分析。
时间复杂度是衡量算法性能的重要指标,它反映了算法在处理输入规模增大时所需的时间。
在分析时间复杂度时,我们需要考虑算法的基本操作次数,并且基于不同输入规模的情况,推导出算法的大O表示法。
4. 实验结果完成实验后,我们得到了动态规划算法的实现代码,并对其进行了时间复杂度分析。
下面是实验结果的总结: - 实现了动态规划算法,并成功解决了一个具体的问题; - 分析了实现代码的时间复杂度,并得出了算法的大O表示法。
5. 总结与展望本次实验通过实现动态规划算法,深入了解了动态规划的设计与分析方法。
实验二银行家算法实验报告
实验二银行家算法实验报告一、实验目的通过本次实验,主要学习了解了银行家算法的原理和实现方式,掌握银行家算法的应用场景,了解了安全序列的概念和判断方法,并通过代码实现加深对银行家算法的理解和掌握。
二、实验过程1、阅读银行家算法的相关理论知识。
2、编写银行家算法的代码实现。
3、根据实验要求,设置不同的初始资源分配和不同的进程请求资源情况,分别计算是否存在安全序列。
三、实验结果与分析1、首先按照实验要求设置一个初始的资源分配情况:可用的资源数目:4 4 4进程数目:4各进程对三种资源的最初需要数目:Max:7 5 33 2 29 0 22 2 2已分配资源数目:Allocation:0 1 02 0 03 0 22 1 1剩余资源数目:Need: 7 4 31 2 26 0 00 1 1根据上述数据,计算出该初试分配情况下的安全序列为:1 -> 3 -> 4 -> 2。
2、然后设置一个进程请求资源的情况:进程 1 请求资源 [3,3,0],进程 2 请求资源 [1,0,1],进程 3 请求资源 [2,2,0],进程 4 请求资源 [0,0,2]。
根据银行家算法,先进行安全性检测,发现该系统不存在安全序列,因此不满足银行家算法的要求,请求不被满足。
3、接着修改初始的资源分配情况和请求的资源情况,进行比较:通过以上的实验操作,得出结论:只有当请求的资源不会导致系统不再安全时,才会满足请求。
银行家算法基于这个假设进行运算,它管理着一个可以分配的表格,该表格显示系统的各种资源已经分配和未分配的情况,并确定哪些进程可以分配资源,哪些不可以。
四、实验总结本次实验通过对银行家算法的概念、原理和应用场景的了解,对该算法有了更深的认识和理解,并通过代码实现和实验操作,进一步巩固和掌握了该算法的应用方法。
在实验过程中,也有一些需要注意的问题:如需要按照一定的顺序输入原数据,正确地计算资源分配和剩余情况;核实每个请求的资源数目是否足够,才进行安全性检测;注意计算过程中数值的准确性和解题思路的正确性等。
RSA加密算法实验报告_2
现代密码学实验报告题目: RSA算法的实现过程
一、实验目的
二、简单实现RSA过程, 通过OpenSSL命令编辑器实现发送方对明文进行加
密, 签名, 接受方验证, 解密的简单过程。
三、实验原理
RSA加密算法的基本流程:
四、实验步骤
发送方对明文进行加密:
首先利用MD5对明文进行摘要操作:
然后生成秘钥文件:
再利用这个密钥对摘要进行加密:
然后对摘要进行签名操作:
发送方加密后要发送的东西是: 明文和摘要的签名传送到接收方后,接收方进行解密操作:
接收方进行验证:
通过比较可以发现所得摘要的结果是相同的, 则可以得到结论: 该明文没有被篡改。
五、实验心得
通过对RSA过程的简单模仿, 我们可以明白理论和现实是有一定差别的, 我们需要将明文利用MD5进行摘要处理, 然后在通过MD5对摘要进行验证, 从而判断密文是否经过修改, 达到数据的安全性, 完整性和保密性。
在使用OpenSSL进行RSA过程模仿时要注意文件名的对应, 这需要我们在命名文件时能做到见名之意, 方便我们后续的操作。
命令行的书写方式需要我们对字母有一定的敏感性, 经常会出现字母出现问题而导致错误的发生。
实验二 A星算法实验
人工智能基础(第2版)
实验二A*算法实验
1.提交期限和方法
2.实验目的
熟悉和掌握启发式搜索的定义、估价函数和算法过程,并利用A*算法求解N 数码难题,理解求解流程和搜索顺序。
3.实验任务
1)实现类似于如图所示N数码难题演示程序。
2)用你所熟悉的程序语言实现,可以B/S实现,也可以C/S实现。
4、实验内容
1)分别以8数码和15数码为例实际求解A*算法。
2)画出A*算法求解框图。
3)分析估价函数对搜索算法的影响。
4 )分析A*算法的特点。
5、提交要求
1、本次实验为个人任务,需独立完成,以纸质和电子档的形式把实验报告提交给学习委员,再由学习委员在规定期限内提交给任课老师。
2、要求把所做的程序的演示图附加到实验报告上,代码不需要添加到实验报告上。
3、撰写实验报告
实验报告具体内容如下:
实验题目、实验目的、实验原理、实验条件、实验内容、实验步骤、程序代码、个人实验小结。
4、未按时提交实验报告者,每迟交一天扣1分,扣完为止。
经辅导员同意并签字的事病假时间不计入迟交范围。
凡被发现实验报告有抄袭者,本次成绩以零分记。
实验二银行家算法
实验二银行家算法一、目的:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效地防止和避免死锁的发生。
二、内容:银行家算法是避免死锁的一种重要方法,本实验要求编写和调试一个简单的银行家算法程序。
用银行家算法实现资源分配。
三、编程思想:首先分析银行家算法的数据结构,分析可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need 、进程申请资源的关系,由所学知识可知;Need[i,j]=Max[I,j]-Allocation[i,j];当进程申请资源的时候;a)Requesti>Need[i]。
这种情况表示该进程的资源需求已超过系统所宣布的最大值,出错。
b)Requesti=Need[i]。
这种情况表示该进程现在对他所需的全部资源一次申请完成。
c)Requesti〉Need[i]。
这种情况表示该进程现在对它所需资源再进行部分的申请,剩余的资源以后再次申请。
当进程pi发出资源请求后;a)如果Requesti<=Need[i],转向步骤b,否则显示为出错,因为所需的资源数超过事先要求的最大值。
b)Requesti <=Available,便转向步骤三,否则则表示尚无足够资源,pi需等待。
c)假如系统将资源分配给pi则:Available=Available-RequestiAllocation[i]=Allocation[i]+RequestiNeed[i]=Need[i]-Request安全性算法检查(1)设置向量:工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work[]= Available[]。
Finish[],它表示系统是否有足够的资源分配给每个进程,使之运行完成。
开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
实验2 银行家算法
实验2 银行家算法(2学时)一、实验目的理解银行家算法,掌握进程安全性检查的方法及资源分配的方法。
二、实验内容编写程序实现银行家算法,并验证程序的正确性。
三、实验要求编制模拟银行家算法的程序,并以下面给出的例子验证所编写的程序的正确性。
例子:某系统有A、B、C、D 4类资源共5个进程(P0、P1、P2、P3、P4)共享,各进程对资源的需求和分配情况如下表所示。
现在系统中A、B、C、D 4类资源分别还剩1、5、2、0个,请按银行家算法回答下列问题:(1)现在系统是否处于安全状态?(2)如果现在进程P1提出需求(0、4、2、0)个资源的请求,系统能否满足它的请求?#include <stdio.h>//#include <tchar.h>#include <iostream>using namespace std;#define Maxprocess 50 /*最大进程数*/#define Maxresource 100 /*最大资源数*/int Available[Maxresource]; /*可用资源数组*/int MAX[ Maxprocess][Maxresource]; /*最大需求矩阵*/int Allocation[ Maxprocess][Maxresource]; /*分配矩阵*/int need [Maxprocess][Maxresource]; /*需求矩阵*/int Request[Maxprocess][Maxresource]; /*进程需要资源数*/bool finish[Maxprocess]; /*系统是否有足够的资源分配*/int p[Maxprocess]; /*记录序列*/int m,n; /*m个进程,n个资源*/void Init();/*初始化算法*/bool Safe(); /*安全性算法*/void Bank(); /*银行家算法*/int main(){Init();Safe();Bank();return 1;}void Init() /*初始化算法*/{int i,j;cout<<"请输入进程的数目:"; /*m个进程,n个资源*/cin>>m;cout<<"请输入资源的种类数:";cin>>n;cout<<"请输入每个进程最多所需的各资源数,按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>MAX[i][j];cout<<"请输入每个进程已分配的各资源数,也按照"<<m<<"x"<<n<<"矩阵输入"<<endl;for(i=0;i<m;i++){for(j=0;j<n;j++){cin>>Allocation[i][j];need[i][j]=MAX[i][j]-Allocation[i][j];if(need[i][j]<0){cout<<"您输入的第"<<i+1<<"个进程所拥有的第"<<j+1<<"个资源数错误,请重新输入:"<<endl;j--;continue;}}}cout<<"请输入各个资源现有的数目:"<<endl;for(i=0;i<n;i++){cin>>Available[i];}}void Bank() /*银行家算法*/{int i,cusneed;char again;while(1){cout<<"请输入要申请资源的进程号(注:第1个进程号为0,依次类推)"<<endl;cin>>cusneed;cout<<"请输入进程所请求的各资源的数量"<<endl;for(i=0;i<n;i++){cin>>Request[cusneed][i];}for(i=0;i<n;i++){if(Request[cusneed][i]>need[cusneed][i]){cout<<"您输入的请求数超过进程的需求量!请重新输入!"<<endl;continue;}if(Request[cusneed][i]>Available[i]){cout<<"您输入的请求数超过系统有的资源数!请重新输入!"<<endl;continue;}}for(i=0;i<n;i++){Available[i]-=Request[cusneed][i];Allocation[cusneed][i]+=Request[cusneed][i];need[cusneed][i]-=Request[cusneed][i];}if(Safe()){cout<<"同意分配请求!"<<endl;}else{cout<<"您的请求被拒绝!"<<endl;for(i=0;i<n;i++){Available[i]+=Request[cusneed][i];Allocation[cusneed][i]-=Request[cusneed][i];need[cusneed][i]+=Request[cusneed][i];}}for(i=0;i<m;i++){finish[i]=false;}cout<<"您还想再次请求分配吗?是请按y/Y,否请按其它键"<<endl;cin>>again;if(again=='y'||again=='Y'){continue;}break;}}bool Safe() /*安全性算法*/ {int i,j,k,l=0;int Work[Maxresource];for(i=0;i<n;i++)Work[i]=Available[i];for(i=0;i<m;i++){finish[i]=false;}for(i=0;i<m;i++){if(finish[i]==true){continue;}else{for(j=0;j<n;j++){if(need[i][j]>Work[j]){break;}}if(j==n){finish[i]=true;for(k=0;k<n;k++){Work[k]+=Allocation[i][k];cout<<Work[k];}p[l++]=i;i=-1;}else{continue;}}if(l==m){cout<<"系统是安全的"<<endl;cout<<"安全序列:"<<endl;for(i=0;i<l;i++){cout<<p[i];if(i!=l-1){cout<<"-->";}}cout<<""<<endl;return true;}}cout<<"系统是不安全的"<<endl;return false;}。
《算法设计与分析》实验二
14210501022017 3 281234121010 3201741112//枢轴元素t为数组最左侧的元素//i往右移动j往左移动当指向同一位置时扫描完成//如果右侧指针元素比轴测元素大,指针元素左移//确保i在j左边//当右侧指针元素比轴测元素小时,交换两指针指向数的位置//如果左侧指针元素比轴测元素小,指针元素右移//确保i在j左边//当左侧指针元素比轴测元素大时,交换两指针指向数的位置//对左边进行排序//对右边进行排序printf("\n");system("pause");getchar();}运行结果经验归纳结合以前学的数据结构及应用算法,较容易理解。
题目二:对用户输入的杂乱无序的数字序列按照由小到大的顺序排序:合并排序题目分析合并排序的基本思想是:将待排序的元素分成大小大相同的两个子集合,分别对两个子集合进行排序,最终将排序好的子集合合并成所要求的拍好序的集合。
算法构造核心代码来自书上:MergePass(Type x[],Type y[],int s,int n)//合并大小为s的相邻序列子数组Merge(Type c[],Type d[],int l,int m,int r) //合并c[l,m]和x[m+1,r]到y[l,r]算法实现//将a中的元素合并到数组b//将b中的元素合并到数组a//合并c[l,m]和x[m+1,r]到y[l,r]//合并大小为s的相邻序列子数组//合并大小为s的相邻2字段数组//合并x[i,i+s-1]和x[i+s,i+2*s-1]到y[i,i+2*s-1] //处理剩下的元素少于2sfor(int j=i;j<=n-1;j++)y[j]=x[j];}void main(){int a[100],i,n;printf("请输入要进行合并排序的数字的个数:\n");scanf_s("%d",&n);for( i=0;i<n;i++){printf("请输入要进行合并排序的第%d个数字:\n",i+1);scanf_s("%d",&a[i]);}MergeSort(a,n);printf("合并排序的结果:\n");for(i=0;i<n;i++)printf("%d,",a[i]);printf("\n");system("pause");}运行结果经验归纳结合以前学的数据结构及应用算法,用心理解还能明白。
算法实验二
实验二:贪心算法【实验目的】应用贪心算法求解活动安排问题。
【实验性质】验证性实验。
【实验要求】活动安排问题是可以用贪心算法有效求解的很好的例子。
问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:将此表数据作为实现该算法的测试数据。
【算法分析】分析:每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。
如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。
若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。
也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
例:给出待安排的11个活动的开始时间和结束时间,要求安排尽量多项活动使用会场。
首先,任意输入这11个活动。
然后对活动以其完成时间的非减序排列。
(意义:使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
)将第一次活动结束时间f[1]与后面活动开始时间s[2]相比较,若s[2]<f[1]则继续比较,直到s[4]>f[1],选中此活动。
再用活动4的结束时间f[4]与其后活动的开始时间比较……同理类推,直到比较完成为止,最后选出合条件的活动1,活动4,活动8和活动11,它们将依次被安排使用该场地。
【调试分析和心得体会】运行依算法写出的程序并分析算法实现的时间复杂度情况。
1.程序源码:#include <iostream>using namespace std;class B{int dataT[11],dataF[11]; //使用两个数组一个放开始时间,一个放结束时间public :void cinP();//用户输入,获得数据void paiXu();//排序void dispaly();//输出排序后的数据void last();//使用贪心算法后得得到的结果};void B::cinP(){for(int i=0;i<11;i++){cout<<"请输入开始时间:"<<endl;cin>>dataT[i];cout<<"请输入结束时间:"<<endl;cin>>dataF[i];}}void B::paiXu(){int munT=0;//实现数据交换的一个中间量int numF=0;//实现数据交换的一个中间量for(int r=0;r<11;r++){for(int j=r+1;j<11;j++){if(dataF[r]>dataF[j]){//对结束时间排序,同时同步改变与之对应的开始时间//保持开始时间和结束时间配套numF=dataF[j];dataF[j]=dataF[r];dataF[r]=numF;//交换结束时间munT=dataT[j];dataT[j]=dataT[r];dataT[r]=munT;//交换开始时间}}}}void B::dispaly(){for(int y=0;y<11;y++){cout<<dataT[y]<<"\t";}cout<<endl;for(int y1=0;y1<11;y1++){cout<<dataF[y1]<<"\t";}void B::last(){int dataQ[11],dataH[11];int g=0;dataQ[0]=dataT[0];dataH[0]=dataF[0];//将一个节目结束时间和另一个节目开始时间进行对比//将符合条件的节目的开始时间和结束时间分别保存在数组,dataQ和dataH中for(int w=1;w<11;w++){if(dataH[g]<=dataT[w]){g++;dataQ[g]=dataT[w];dataH[g]=dataF[w];}}cout<<endl<<endl;for(int ye=0;ye<=g;ye++){cout<<dataQ[ye]<<"\t";}cout<<endl;for(int y1e=0;y1e<=g;y1e++){cout<<dataH[y1e]<<"\t";}}int main(int argc, char** argv) {B b;b.cinP();b.paiXu();b.dispaly();st();return 0;}2.运行结果:3.时间复杂度分析:本程序运用的核心数据结构是数组,由于存在两层for循环因此分析得出时间复杂度为:。
算法与数据结构实验报告实验二
算法与数据结构实验报告实验二实验名称:线性表实现集合运算姓名:卢丽娟学号:211006289专业:软件工程班级:二班指导教师:陈亦萍日期: 2012年3月24日一、实验目的本实验是要实现线性表的集合运算,通过该实验更深刻地理解线性结构的特点,学会并掌握线性表的顺序或链式表示和实现。
二、实验内容与实验步骤采用线性表表示集合,用线性表实现集合以及基本操作,实现两个集合的并、交、差运算。
用到的各种函数如下程序步骤所示。
步骤:1. 链表销毁void DestoryList_L(list& L){ list p=L->next,s;while(p){ s=p; p=p->next;free(s);}L->next=NULL;}2. 链表初始化void InitList(list &L){ L=NULL;}3. 往链表L中插入元素e,并按升序排列,如果L中已有元素e,则不插入ListInsert_L(list &L, char e){ list p=L->next,t,s; t = L;while(p!=NULL &&p->data<= e){ if(p->data==e) return OK;t=p; p=p->next;}s =(list)malloc(sizeof(LNode));s->data=e;s->next=p;t->next=s;return OK;}4. 创建链表,按字符串输入元素void CreateList_L(list &L, int n){ L =(list)malloc(sizeof(LNode));L->next=NULL;int i=0;for(i=n;i>0;i--){ char e; scanf("%c",&e);ListInsert_L(L,e);}getchar();}5.定义输入函数,分配存储空间void inputdata(list head)//定义输入函数{ list p;char tmp;scanf("%c",&tmp);while(tmp!='\n'){ p=(list)malloc(sizeof(struct LNode));//分配存储空间p->data=tmp;p->next=head->next;head->next=p;scanf("%c",&tmp); }}6.定义输出函数,初始化,并判断其是否为空void outputdata(list head)//定义输出集合函数{ list p;p=head->next;//初始化,p指向第一个结点while(p!=NULL)//判断是否为空{ printf("%c",p->data);p=p->next;} printf("\n");//输出集合函数}7.定义集合的并集函数,其中函数的数据元素均已按值非递减排列void MergeList(list head1,list head2,list head3)//定义集合的并集函数{//已知p1、p2中的数据元素按值非递减排列。
算法分析与设计实验二
实验二、动态规划算法的应用班级:计072学号:**********姓名:***一、实验目的与实验内容1、掌握动态规划算法的基本设计思想与原则。
2、最长公共子序列、0-1背包,找零钱二、实验要求1.用C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
三、程序实现最长公共子序列:对字符串X和Y,首先构建子问题最有值的递归关系。
用c[i][j]记录序列X i和Y j的最长公共子序列的长度。
其中X i={x1,x2,…,x i};Y j={y1,y2,…,y j}.当i=0或j=0时,空序列就是X i和Y j的最长公共子序列。
故此时c[i][j]=0.其他情况下,由最优子结构性质可建立递归关系如下:0 i=0,j=0c[i][j]= c[i-1][j-1]+1 i,j>0;x i=y jmax{c[i][j-1],c[i-1][j]} i,j>0;x i=y j0-1背包问题:设所给0-1背包问题的子问题max∑n k=i v k x k∑n k=i v k x k<=jx k∈{0.1},i<=k<=n的最优值为m(i,j),即m(i,j)是背包容量为j,可选择物品为i,i+1,…,n时0-1背包问题的最优值。
由0-1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:m(i,j)= max{m(i+1,j),m(i+1,j-w i)+v i} j>=w im(i+1,j) 0<=j<w iv n j>=w nm(n,j)= 0 0<=j<w n找零钱:在这次实验中,由于听错实验的最后一个题目,所以找零钱的这个实验我是完全参照0-1背包问题的。
时间复杂度:最长公共子序列:计算最优值c[i][j]的算法设计中,双层循环外规模为m,内规模为n,所以计算它的时间复杂度为0(mn).0-1背包与找零钱:由他的递归表达式可得时间复杂度为0(nc).四、心得体会通过此次实验,我的最深感触就是对算法的思想一定要理解,不然只是徒劳。
实验项目二:算法基本策略
实验项目二:算法基本策略《算法设计与分析》实验报告实验项目(二)算法的基本策略专业、班级学号号姓名名实验时间实验地点指导教师教学目标使学生掌握算法设计与分析中的基本原理、基本技术和方法,提升计算机问题求解的水平。
熟练掌握编程中常见问题的求解策略,培养学生对算法复杂性进行正确分析的能力。
(1)掌握编程求解问题的常用算法策略。
(2)熟练强化深入计算机求解问题的过程。
(3)增强理论结合实际能力,增强获得理论联系实际问题的能力。
(4)培养系统分析能力和团队协作能力。
一、实验目的及要求(1)练习运用枚举、迭代、分治、贪心和动态规划等基本算法策略求解问题;(2)熟练掌握算法基本策略的建模和编码实现。
二、实验设备(环境)及要求使用C/C++语言,VisualStudio201X开发环境,Windows系列操作系统环境三、成绩评定题号题型能力分值成绩备注①设计题分析20②设计题分析30③设计题分析40④报告格式10总成绩四、实验内容与步骤1、编写程序,分别用二分法和牛顿迭代法求解方程x33x1=0在x=2附近的实根,要求计算精确到小数点后7位数字为止,并将求出的近似结果与理论值2cos20比较误差大小。
设二分法的初始迭代区间为[1,3],牛顿迭代法的起点为4。
2、将一张100元的钞票换成1元、2元、5元和10元的零钱,每种零钞至少一张,编写程序输出所有的换法,尽可能地提高算法效率。
3、用动态规划求解设备更新问题。
某人打算购买一辆新的小货车用于运货,货车的售价是22万元人民币。
货车购买后,每年的各种保险费、养护费等费用如下表:如果5年内将货车售出,并再购买新车,5年内的二手车销售价如下表:设计一种购买货车的方案,使5年内用车的总费用最少。
选作:将其中所有的数据,包括售价、年份、各年份的费用和各年份二手车销售价等的数据改为任意值。
1.二分法:#includestdio.h#includemath.hvoidmain(){doublex ,x1=1,x2=3,f1,f2,f;f1=x1*x1*x1-3*x1-1;f2=x2*x2*x2-3 *x2-1;if(f1*f20)printf(在此区间没有根!else {do{x=(x1+x2)/2;f=x*x*x-3*x-1;if(f==0)break;els eif(f1*f0){x1=x;f1=f;}else{x2=x;}}while(fabs(x1-x2) =0.000001);printf(近似值为:%.7f\n,x);printf(与理论值相差为:%.7f,x-1.8793852);}}牛顿迭代法:#includestdio.h#includemath.hvoidmain(){doublef 0,f1,x0,x1=2;do{x0=x1;f0=3*x0*x0-3;f1=x0*x0*x0-3*x0 -1;x1=x0-f1/f0;}while(fabs(x1-x0)=0.0000001);printf (近似值为:%.7f,x1);printf(与理论值相差:%.7f,x1-1.8793852);}2.#includeiostreamusingname spacestd;intmain(){intN,i,j,k,l,n=0;cout请输入一个正整数N(1N1000)endl;cinN;for(i=1;ii++){for(j=1;j=N/2;j++){for(k=1; k=N/5;k++){for(l=1;l=N/10;l++){if(i*1+j*2+k*5+l*10= =N){cout其中一元有:i张二元有:j张五元有:k张十元有:l张endl;n++;}}}}}cout一共有:n种组合方式endl;return0;}3.源代码:#includeiostream#includevectorusingnamespacestd ;intpro[5]={3,5,10,16,21};//货车保护费intsale[6]={0,17,15,7,4,2};//二手车销售价格intminmoney=-65536;#defineMAX20intnum[MAX]={1,2,3,4 };intn=0;vectorvectorintps;voidsolve(intn){vectorve ctorintps1;vectorvectorint::iteratorit;vectorintps. push_back(s);for(inti=0;ii++){ps1=ps;for(it=ps1.begin();it!=ps1.end();++it){( *it).push_back(num[i]);}for(it=ps1.begin();it!=ps1. end();++it){ps.push_back(*it);}}}voidshow(){vectorv ectorint::iteratorit;inti=1;for(it=ps.begin();itps. end();++it){intmoney=0;cout第i种方案:endl;i++;for(vectorint::iteratorsit=(*it).begin( );sit!=(*it).end();++sit){if(sit==(*it).begin()){mo ney=money-pro[*sit-1]+sale[*sit]-22;}else{money=mon ey-pro[*sit-*(sit-1)-1]+sale[*sit-*(sit-1)]-22;}cou t\t在第*sit年卖出并购入新车endl;}if((*it).empty()){money=money-pro[4]+sale[5]-22;cout\t在第5年卖出并购入新车endl;}else{money=money-pro[4-*((*it).end()-1)]+sale [5-*((*it).end()-1)]-22;cout\t在第5年卖出并购入新车endl;}cout\t共花费-money万元endl;}}intmain(){for(inti=1;ii++){pro[i]+=pro[i-1];} vectorintsolve(4);show();system(pausereturn0;}程序运行结果:。
算法分析实验二报告
《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.整数因子分解问题内容描述:大于1 的正整数n可以分解为:n=x1*x2*…*xm。
例如,当n=12 时,共有8 种不同的分解式:12=12;12=6*2;12=4*3;12=3*4;12=3*2*2;12=2*6;12=2*3*2;12=2*2*3。
对于给定的正整数n,编程计算n共有多少种不同的分解式。
功能分析:输入一行对应1 个正整数n (1≤n≤2000000000),输出对应的n的不同分解式。
例如:输入:12,输出:82.邮局选址问题内容描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y 坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
功能分析:输入由多组测试数据组成。
每组测试数据输入的第1 行是居民点数n,1≤n≤10000。
接下来n 行是居民点的位置,每行2 个整数x 和y,-10000≤x,y≤10000。
对应每组输入,输出的第1 行中的数是n 个居民点到邮局的距离总和的最小值。
例如:输入:5 输出:101 22 21 33 -23 3二、算法过程设计.1.整数因子分解问题通过函数的定义和相关变量的定义,根据数学上整数因子的分解算法,来对程序进行设计。
2.邮局选址问题通过题目给定的意思,可以知道其数学算法,通过调用库函数来实现程序的设计和结果的实现。
三、程序调试及结果(附截图).1.整数因子分解问题2.邮局选址问题四、源代码(附源代码).1.整数因子分解问题#include<stdio.h>#include<math.h>struct DP{ int num;int sum;} d[50000]={0};int max=0;void qsort(int low,int high,struct DP key[]){ int i=low,j=high;struct DP tag=key[i];if(i<j){ do{ while(tag.num<key[j].num && i<j) j--;if(i<j){ key[i]=key[j];i++;while(tag.num>=key[i].num && i<j) i++;if(i<j){ key[j]=key[i];j--;}}}while(i<j);key[i]=tag;qsort(low,j-1,key);qsort(i+1,high,key);}}int dfs(int left){ int i,p;int l,r,m;int count=0;l=0; r=max;while(l<=r){ m=(l+r)>>1;if(d[m].num<left) l=m+1; else r=m-1;}p=l; if(d[p].sum) return d[p].sum;for(i=1;i<=d[i].num;i++){ if(left%d[i].num==0) count+=dfs(left/d[i].num); }d[p].sum=count;return count;}int main(void){ int i,j,tmp;int n;scanf("%d",&n); tmp=sqrt(n);for(i=1;i<=tmp;i++){ if(n%i==0){ d[max].num=i; max++;d[max].num=n/i; max++;}} max--;qsort(0,max,d);d[0].sum=1;printf("%d\n",dfs(n));return 0;}2.邮局选址问题#include<stdio.h>#include<stdlib.h>#include<math.h>int cmp( const void *a , const void *b ) { return *(int *)a - *(int *)b; } int main(){ int i,a[10005],b[10005],n,y,x;int sum;while(scanf("%d",&n)==1){ for(i=0;i<n;i++)scanf("%d%d",&a[i],&b[i]);qsort(b,n,sizeof(b[0]),cmp);qsort(a,n,sizeof(a[0]),cmp);y=b[(n-1)/2];x=a[(n-1)/2];sum=0;for(i=0;i<n;i++){ sum=sum+fabs(b[i]-y);sum=sum+fabs(a[i]-x);}printf("%d\n",sum);}return 0;}。
《实践算法二》
《实践算法二》作文,希望能符合您的需求:哎呀,说起算法,我以前一直觉得那是个高深莫测的东西,好像离我的生活十万八千里呢。
但最近经历的一件事儿,让我对算法有了新的认识。
那天,我跟着爸妈去了姥姥家。
姥姥家在一个小村庄,那里可热闹啦!一到姥姥家,我就被一群小伙伴拉着去玩捉迷藏。
“石头剪刀布!”我们几个喊着,决定谁先找人。
结果是小胖输啦,他一脸不情愿地蒙上眼睛,开始数数:“1、2、3……”我们其他人像小老鼠一样四散跑开,找地方藏起来。
我瞅见了一个柴草堆,心想:“这地方不错,小胖肯定找不到。
”我悄悄地钻了进去,大气都不敢出。
小胖开始找啦,他东瞅瞅西看看,嘴里还嘟囔着:“都藏哪儿去啦?”这时候,二妞不小心弄出了声响,被小胖一下子就发现了。
“哈哈,找到你啦!”小胖得意地喊着。
我在柴草堆里蹲着,腿都麻了,心里祈祷着千万别被发现。
可谁知道,我忍不住打了个喷嚏。
“谁?”小胖立刻朝这边走来。
“完了完了,要被发现啦!”我心里那个紧张啊。
就在小胖快要走到柴草堆的时候,姥姥喊我们:“孩子们,快来吃西瓜啦!”这一喊,可把小胖的注意力吸引走了。
我趁机赶紧跑出来,和大家一起吃西瓜。
你看,这捉迷藏就像是一种算法。
每个人都在寻找最优的躲藏位置,而找人的那个就得通过各种线索和判断来找到大家。
虽然没有什么复杂的公式和代码,但其实也包含着思考和策略呢。
经过这次有趣的捉迷藏,我明白了,生活中很多看似简单的游戏和事情,其实也有着类似算法的逻辑在里面。
以后再碰到难题,我可得好好琢磨琢磨这里面的“算法”。
怎么样,这次的经历是不是很有趣?这就是我对算法的一次特别实践啦!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二:贪心算法
【实验目的】
应用贪心算法求解活动安排问题。
【实验性质】
验证性实验。
【实验要求】
活动安排问题是可以用贪心算法有效求解的很好的例子。
问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。
求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。
设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:
将此表数据作为实现该算法的测试数据。
【算法分析】
分析:每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。
如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。
若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。
也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。
例:给出待安排的11个活动的开始时间和结束时间,要求安排尽量多项活动使用会场。
首先,任意输入这11个活动。
然后对活动以其完成时间的非减序排列。
(意义:使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
)
将第一次活动结束时间f[1]与后面活动开始时间s[2]相比较,若s[2]<f[1]则继续比较,直到s[4]>f[1],选中此活动。
再用活动4的结束时间f[4]与其后活动的开始时间比较……同理类推,直到比较完成为止,最后选出合条件的活动1,活动4,活动8和活动11,它们将依次被安排使用该场地。
【调试分析和心得体会】
运行依算法写出的程序并分析算法实现的时间复杂度情况。
1.程序源码:
#include <iostream>
using namespace std;
class B{
int dataT[11],dataF[11]; //使用两个数组一个放开始时间,一个放结束时间public :
void cinP();//用户输入,获得数据
void paiXu();//排序
void dispaly();//输出排序后的数据
void last();//使用贪心算法后得得到的结果
};
void B::cinP(){
for(int i=0;i<11;i++){
cout<<"请输入开始时间:"<<endl;
cin>>dataT[i];
cout<<"请输入结束时间:"<<endl;
cin>>dataF[i];
}
}
void B::paiXu(){
int munT=0;//实现数据交换的一个中间量
int numF=0;//实现数据交换的一个中间量
for(int r=0;r<11;r++){
for(int j=r+1;j<11;j++){
if(dataF[r]>dataF[j])
{
//对结束时间排序,同时同步改变与之对应的开始时间
//保持开始时间和结束时间配套
numF=dataF[j];
dataF[j]=dataF[r];
dataF[r]=numF;
//交换结束时间
munT=dataT[j];
dataT[j]=dataT[r];
dataT[r]=munT;
//交换开始时间}
}
}
}
void B::dispaly(){
for(int y=0;y<11;y++){
cout<<dataT[y]<<"\t";
}
cout<<endl;
for(int y1=0;y1<11;y1++){
cout<<dataF[y1]<<"\t";
}
void B::last(){
int dataQ[11],dataH[11];
int g=0;
dataQ[0]=dataT[0];
dataH[0]=dataF[0];
//将一个节目结束时间和另一个节目开始时间进行对比
//将符合条件的节目的开始时间和结束时间分别保存在数组,dataQ和dataH中
for(int w=1;w<11;w++){
if(dataH[g]<=dataT[w]){
g++;
dataQ[g]=dataT[w];
dataH[g]=dataF[w];
}
}
cout<<endl<<endl;
for(int ye=0;ye<=g;ye++){
cout<<dataQ[ye]<<"\t";
}
cout<<endl;
for(int y1e=0;y1e<=g;y1e++){
cout<<dataH[y1e]<<"\t";
}
}
int main(int argc, char** argv) {
B b;
b.cinP();
b.paiXu();
b.dispaly();
st();
return 0;
}
2.运行结果:
3.时间复杂度分析:
本程序运用的核心数据结构是数组,由于存在两层for循环因此分析得出时间复杂度为:。