算法设计与分析实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析
学号:120410101
姓名:陈颖萍
班级:1204101
日期:2014.01.01
实验题目1
1-1问题描述:
括号检验:输入一个代数表达式,表达式只能含有+,—,*,/,1,2,3,4,5,6,7,8,9,0字符且每个数字均小于10,设表达式除括号外匹配有误外,再无其他错误。编写算法对输入的表达式进行检验,判断括号匹配是否正确。
正确的:错误的:
1+2+4 (1+)2
(1+2)+4 (1+2(4+3))
(1+2) (1+2+3*(4+5()))
1+2+3*(4+5))
1-2问题分析:
编写算法对输入的表达式进行检测,判断括号匹配是否正确。如果对于输入的表示能按照正确的优先级将最终结果求出那么表达式肯定是正确的。而如果要求出最终结果,效率会低,那么对运算过程进行简化,按照所给的表达式推导出最终可以求出结果那么表达式肯定是正确的,括弧肯定匹配。
1-3策略选择:
采用蛮力法,从右向左处理表达式一旦出现错误的情况直接输出不匹配退出,否则继续进行处理直至表达式结束。用栈作为存储结构约定优先级。Stack S,OP; S存储运算符,OP存储参与运算的数字。遇到‘(’、数字,时直接压入相应的栈中,当遇到+、-、*、/操作符是先把栈S中的栈顶元素取出比较相应的优先级,若当前操作符的优先级低与栈顶的则进行一次运算。不断计算直至符合结束条件。
1-4模型:
采用信息数字化的方法,用栈作为存储结构约定优先级。Stack S,OP; S存储运算符,OP存储参与运算的数字。遇到‘(’、数字,时直接压入相应的栈中,当遇到+、-、*、/操作符是先把栈S中的栈顶元素取出比较相应的优先级,若当前操作符的优先级低与栈顶的则进行一次运算。由于问题要求的是单位数而进行相应的运算后可能会变成小数,或多位数,若对其进行处理会麻烦,则默认运算后结果是1,将以压入相应的栈中。若在运算过程中不能进行或不可操作则说明表达式不正确。
1-5时间及空间复杂度分析
1-6算法描述(流程图):
1-7算法实现:
1-8测试及说明:
1-9总结
实验题目2
2-1问题描述:
某售货员要到若干城市去推销商品,已知个城市之间的路程(或旅费)。要选择一条从驻地出发,经过每一个城市一遍,最后回到驻地的路线,使总的路线最小。问题的解为从一个带权图中找到一个包含所有顶点的回路,且该回路的权值之和最小。用邻接矩阵存储图。
2-2问题分析:
该问题可以用邻接矩阵存储图,图的下标表示两个城市,图的权值表示两城市间的路程,此时的邻接矩阵是关于主对角线对称的。在此问题中要设定NoEdge =-1来表示当两个城市间无通路时邻接矩阵存储的值,方便在连接结点时进行判断。
2-3策略选择:
采用蛮力枚举的递归法,递归出口为i=n+1表示到达第n+1层也就是最后一个结点,此时完成了递归。递归公式为Traveling(i+1,n),表示继续判断下一个结点是否能连接。 2-4模型:
采用递归公式的抽象的方法,问题的解为含有N 个节点的一条回路,可以尝试将所有的路径都找出来找到权值之和最小的一条路径就为问题的解。向当前求解的路径中不断加入新的节点,当节点数为N 时一条新的回路产生。可以路径的长度为控制量,用递归的方法求解所有的路径,如果有边与前一顶点相连且此点之前距离和仍小于最小值,那么可以选择这条路径,继续递归直至达到递归出口。
2-5时间及空间复杂度分析
时间复杂度:T(log 2n) 空间复杂度:S(n 2)
2-6算法描述(流程图): 2-7算法实现:
#include
using namespace std;
const int NoEdge=-1;//表示两城市间不通 const int MAX=20; int G[MAX][MAX]; int ans[MAX],x[MAX]; int bestc,cc;
void init(int n,int m) { int i,j,len,t; memset(G,NoEdge,sizeof(G));//
cout<<"请输入城市间的路程"< { cin>>i>>j; cin>>len; G[i][j]=len;//给加权邻接矩阵赋值 G[j][i]=len; } for(i=1;i<=n;i++) x[i]=i; bestc=-1;//0x7fffffff 表示赋权值无限大,也可以是 cc=0;//当前路程 } void Swap(int &i,int &j) { int t; t=i; i=j; j=t; } } { } { while(1) { cout<<"请输入城市的个数"< cout<<"请输入城市间通路的条数 cin>>m; init(n,m); Traveling(2,n); print(n); } } 2-8测试及说明: 2-9总结 在此次实验中,我进一步练习了图的邻接矩阵的存储方式,在无向图的存储中,邻接矩阵是关于主对角线对称的,在初始化的过程中要注意双向初始化。当两城市间无通路时,要用特殊数值进行标记,方便进行判断。在今后的学习中,要学会将问题抽象出来进行解决。 实验题目3 3-1问题描述: 设有A,B,C,D,E 5人从事J1,J2,J3,J4,J5 5项工作,每人只能从事一项,他们的效益如下