ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:105.63KB ,
资源ID:5232916      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5232916.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法分析课程设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法分析课程设计.docx

1、算法分析课程设计算法分析与设计实验报告书 评分:_题目:(例如)基于矩阵变换算法的图同构识别设计人:李文森班级:网络工程2班 学号:1214080613213一、 实验环境:1、硬件环境:个人机,CPU主频:2.3GHZ 内存:4GB2、软件环境:操作系统:windows编程语言:C+二、 实验任务解决方案:实验思路:设两个无向图G=(V,E),G=(V,E),G,G同构当且仅当两图的邻接矩阵、行间同或矩阵、行间异或矩阵具有相同的行行置换。1. 矩阵算法步骤a. 根据定义,求出同型矩阵AAG、AAG.b. 计算出行间同或矩阵RAG、RAG,行间异或矩阵RXG、RXG.c. 以图G=(V,E)的

2、行间异或矩阵为参照,对RXG的每一行,从RXG搜索所有行,找到一个匹配。若不存在相应匹配,则两图不同构;若匹配,转步骤(4).d. 判断邻接矩阵AG、AG,行间同或矩阵中是否存在同样的匹配,若匹配存在,调整邻接矩阵AG、行间异或矩阵RXG、行间同或矩阵RAG对应的行和列;若不匹配,则不同构.2、基于矩阵变换算法的流程图。3、基于矩阵变换算法实现的关键代码。/*冒泡排序void wensen_mp(int mp,int n) int t; for(int i=0;in-1;i+) for(int j=0;jmpj+1) t=mpj; mpj=mpj+1; mpj+1=t; /核心代码/异或矩阵行

3、转换void wensen_hx(int *p1,int *p13,int *p14,int *p2,int *p23,int *p24,int n) int *p77=new intn;/用于替换的临时一维数组,存放p13 int *p88=new intn;/用于替换的临时一维数组,存放p23 int *p33=new intn;/用于替换的临时一维数组,存放p1 int *p44=new intn;/用于替换的临时一维数组,存放p14 int *p55=new intn;/用于替换的临时一维数组,存放p2 int *p66=new intn;/用于替换的临时一维数组,存放p24 int

4、*p99=new intn;/用于行行替换的临时数组 int t; int tt;/进行跳转判断 int ttt=0;/进行跳转判断 /行行替换 for( int i=0;in;i+) /首先进行行赋值给另外一个数组p13 for(int i77=0;i77n;i77+) p77i77=p13ii77; /首先进行行赋值给另外一个数组p1 for(int i33=0;i33n;i33+) p33i33=p1ii33; /首先进行行赋值给另外一个数组 for(int i44=0;i44n;i44+) p44i44=p14ii44; /p77,p33,p44冒泡排序 wensen_mp(p77,n

5、); wensen_mp(p33,n); wensen_mp(p44,n); /开始进行比较,p12的每一行与p23的每一行进行比较 for(int y=i;yn;y+) tt=0; /首先进行行赋值给另外一个数组 for(int i88=0;i88n;i88+) p88i88=p23yi88; /首先进行行赋值给另外一个数组 for(int i55=0;i55n;i55+) p55i55=p2yi55; /首先进行行赋值给另外一个数组 for(int i66=0;i66n;i66+) p66i66=p24yi66; /p88,p55,p66冒泡排序 wensen_mp(p88,n); wen

6、sen_mp(p55,n); wensen_mp(p66,n); /开始比较 for(int a=0;an;a+) if(p77a=p88a) tt=a; if(a=n-1)/也就是各个都相等,找到匹配 /开始进行邻接矩阵对应位置比较 for(int b=0;bn;b+) if(p33b=p55b) continue; else if(bn-1) cout不同构n; return; /开始进行同或矩阵 for(int c=0;cn;c+) if(p44c=p66c) continue; else if(cn-1) cout不同构n; return; ttt+;/表示成功匹配一行 /进行行行转换

7、p2 for(int u1=0;u1n;u1+) t=p2iu1; p2iu1=p2yu1; p2yu1=t; for(int u11=0;u11n;u11+) t=p2u11i; p2u11i=p2u11y; p2u11y=t; /进行行行转换p23 for(int u2=0;u2n;u2+) t=p23iu2; p23iu2=p23yu2; p23yu2=t; for(int u22=0;u22n;u22+) t=p23u22i; p23u22i=p23u22y; p23u22y=t; /进行行行转换p24 for(int u3=0;u3n;u3+) t=p24iu3; p24iu3=p2

8、4yu3; p24yu3=t; for(int u33=0;u33n;u33+) t=p24u33i; p24u33i=p24u33y; p24u33y=t; break; else continue; else if(y=n-1)/一直循环到最后都未找到匹配 cout不同构n; return; else break; /上面的匹配没有问题,则进行行替换 if(tt=n-1) if(ttt=n) cout同构n; return; else break; /成功跳出循环判断下一行 三、 基于矩阵变换算法的计算复杂度分析(最好、最差、平均情况复杂度):1.同构最好情况是:每一行都互相对应,所以复杂

9、度为:3n2+3n3+8n2时间复杂度为O(n3)。2.同构最坏情况是:每一行都与最后一行对应,所以复杂度为:3n2+3n3+8n*n!时间复杂度为O(n*n!)3.所以平均时间复杂度为O(n*n!)四、 总结综合实验心得体会:1.实例演示邻接矩阵:2. 实验体会本课程设计是为了判断无向图是否同构,采用了较为容易实现的邻接矩阵,同时用到了同型矩阵、行间异或矩阵、行间同或矩阵等知识。知道了同构当且仅当两图的邻接矩阵、行间同或矩阵、行间异或矩阵具有相同的行行置换。通过他们之间对应的关系,我写出了这个算法,并已经初步测试过,能正确判断图是否同构。通过本次的课程设计,让我更好的了解了算法的重要性,一个

10、优异的算法能极大的减少运行时间。在本课程设计上,在异或矩阵的比对上,为了更好的实现元素比对,我采用了了冒泡排序法,可以让它实现有序的比对,这样就减少了比对的次数,减少运算时间。本算法还有挺多改进的地方,例如,算法复杂度太大,所以算法还有待进一步改善,以达到更优。/完全代码#includeusing namespace std;/定义函数/22222222222222222222222同型矩阵void wensen_tx(int *p1,int *p2,int n) for(int i=0;in;i+) for(int j=0;j0) p2ij=1; else p2ij=0; /33333333

11、33333333333333异或矩阵void wensen_yh(int *p1,int *p2,int *p3,int n) for( int i=0;in;i+) for(int j=0;jn;j+) if(i=j) p3ij=p1ii; else int sum1,sum12; sum1=0; for(int k=0;kn;k+) if(p2ik=p2jk) sum12=0; else sum12=1; sum1=sum1+(p1ik+p1jk)*sum12; p3ij=sum1; /44444444444444444同或矩阵void wensen_th(int *p1,int *p2,

12、int *p4,int n) for(int i=0;in;i+) for(int j=0;jn;j+) if(i=j) p4ij=p1ii; else int sum1,sum12; sum1=0; for(int k=0;kn;k+) if(p2ik=p2jk) sum12=1; else sum12=0; sum1=sum1+(p1ik+p1jk)*sum12; p4ij=sum1; /输出函数void wensen_out(int *p,char *s,int n) couts; coutn; for(int i=0;in;i+) for(int j=0;jn;j+) coutpij;

13、 coutt; coutn; /*冒泡排序void wensen_mp(int mp,int n) int t; for(int i=0;in-1;i+) for(int j=0;jmpj+1) t=mpj; mpj=mpj+1; mpj+1=t; /核心代码/异或矩阵行转换void wensen_hx(int *p1,int *p13,int *p14,int *p2,int *p23,int *p24,int n) int *p77=new intn;/用于替换的临时一维数组,存放p13 int *p88=new intn;/用于替换的临时一维数组,存放p23 int *p33=new i

14、ntn;/用于替换的临时一维数组,存放p1 int *p44=new intn;/用于替换的临时一维数组,存放p14 int *p55=new intn;/用于替换的临时一维数组,存放p2 int *p66=new intn;/用于替换的临时一维数组,存放p24 int *p99=new intn;/用于行行替换的临时数组 int t; int tt;/进行跳转判断 int ttt=0;/进行跳转判断 /行行替换 for( int i=0;in;i+) /首先进行行赋值给另外一个数组p13 for(int i77=0;i77n;i77+) p77i77=p13ii77; /首先进行行赋值给另外

15、一个数组p1 for(int i33=0;i33n;i33+) p33i33=p1ii33; /首先进行行赋值给另外一个数组 for(int i44=0;i44n;i44+) p44i44=p14ii44; /p77,p33,p44冒泡排序 wensen_mp(p77,n); wensen_mp(p33,n); wensen_mp(p44,n); /开始进行比较,p12的每一行与p23的每一行进行比较 for(int y=i;yn;y+) tt=0; /首先进行行赋值给另外一个数组 for(int i88=0;i88n;i88+) p88i88=p23yi88; /首先进行行赋值给另外一个数组

16、 for(int i55=0;i55n;i55+) p55i55=p2yi55; /首先进行行赋值给另外一个数组 for(int i66=0;i66n;i66+) p66i66=p24yi66; /p88,p55,p66冒泡排序 wensen_mp(p88,n); wensen_mp(p55,n); wensen_mp(p66,n); /开始比较 for(int a=0;an;a+) if(p77a=p88a) tt=a; if(a=n-1)/也就是各个都相等,找到匹配 /开始进行邻接矩阵对应位置比较 for(int b=0;bn;b+) if(p33b=p55b) continue; els

17、e if(bn-1) cout不同构n; return; /开始进行同或矩阵 for(int c=0;cn;c+) if(p44c=p66c) continue; else if(cn-1) cout不同构n; return; ttt+;/表示成功匹配一行 /进行行行转换p2 for(int u1=0;u1n;u1+) t=p2iu1; p2iu1=p2yu1; p2yu1=t; for(int u11=0;u11n;u11+) t=p2u11i; p2u11i=p2u11y; p2u11y=t; /进行行行转换p23 for(int u2=0;u2n;u2+) t=p23iu2; p23iu

18、2=p23yu2; p23yu2=t; for(int u22=0;u22n;u22+) t=p23u22i; p23u22i=p23u22y; p23u22y=t; /进行行行转换p24 for(int u3=0;u3n;u3+) t=p24iu3; p24iu3=p24yu3; p24yu3=t; for(int u33=0;u33n;u33+) t=p24u33i; p24u33i=p24u33y; p24u33y=t; break; else continue; else if(y=n-1)/一直循环到最后都未找到匹配 cout不同构n; return; else break; /上面的匹配没有问题,则进行行替换 if(tt=n-1) if(ttt=n) cout同构n; return; else break; /成功跳出循环判断下一行 /主程序int main() int n;/图的顶点数 char *s;/字符串提示 char ss=y; coutn; cout*欢迎进入李文森图同构判断*nnn; while(ss=y) coutn;/接收第一个图的顶点个数 if(cin.fail() cout*输入错误,请重新输入*

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1