




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
社会网络分析系统的设计和实现1目录一、设计题目1二、需求分析11)运行环境(软、硬件环境)12)输入的形式和输入值的范围13)输出的形式描述24)功能描述25)测试数据2三、概要设计31)抽象数据类型定义描述32)功能模块设计(如主程序模块设计)43)模块层次调用关系图4四、详细设计5五、调试分析111)问题和改进112)时间&空间复杂度12六、测试结果13七、结论15八、附录:程序设计源代码16一、 设计题目【实验题目】社会网络分析系统的设计和实现【问题描述】实现一个社会网络分析系统。【基本要求】系统功能主要包括:1) 对email数据进行预处理,利用数据结构课程中图中的理论,建立社会网络的邻接矩阵。2) 利用度的概念,找出社会网络中核心人物、活跃人物和边缘人物。3) 利用子图概念分析社会网络的结构,找出小团体和联系小团体的桥接人物。4) 能查找任何人的交往圈子。二、 需求分析1)运行环境(软、硬件环境)软件:MyEclipse Professional 2014硬件:能运行MyEclipse Professional 2014的硬件平台如CPU:Intel酷睿i5;内存4G;操作系统Windows82)输入的形式和输入值的范围数据类型:文本(txt)范围:在txt文本的最大存储范围内3)输出的形式描述采用界面形式输出1 该社会网络中个人的收发邮件数量2 该社会网络中的核心人物、活跃人物、边缘人物3 该社会网络中的小团体、桥接人物4 该社会网络中单个人的交往圈子4)功能描述1. 对email数据进行预处理,利用数据结构课程中图中的理论,建立社会网络的邻接矩阵2. 利用度的概念,找出社会网络中核心人物、活跃人物和边缘人物3. 利用子图概念分析社会网络的结构,找出小团体和联系小团体的桥接人物4. 能查找任何人的交往圈子5)测试数据三、 概要设计1)抽象数据类型定义描述public SeqList(int size)/数组构造函数public Edge(int start,int dest,int weight)/边构造函数public AdjMatrixGraph(int size)/建立邻接矩阵public AdjMatrixGraph(T vertices,Edge edges)/建立邻接矩阵public int vertexCount()/邻接矩阵中顶点的个数public T get(int i)/取出第i个顶点的内容public String toString()/输出邻接矩阵public int insertVertex(T x)/插入邻接矩阵的顶点public void insertEdge(Edge edge)/插入邻接矩阵的度public void insertEdge(int i,int j,int weight)/插入邻接矩阵的度public int outdegres()/邻接矩阵中每个对象的出度总和public int indegres()/邻接矩阵中每个对象的入度总和2)功能模块设计(如主程序模块设计)public String activeperson()/活跃人物public String mainperson()/核心人物public String marginalperson()/边缘人物public boolean isExist(String temp,String str,int t)/是否存在该人public String group_one(String vertices,String str)/个人的圈子public String Connecter()/桥接人public String group(String vertices,String str)/圈子public String teamgroup()/小团体public int team()/团体public boolean isConnection(int temp,int i,int j,int t)/是否与其他人有联系3)模块层次调用关系图四、 详细设计在程序内定义一个AdjMatrixGraph的类来实现程序的基本操作。定义import_email这个类来实现文本的读取。定义MainFrm来实现数据的输出。AdjMatrixGraph类:protected SeqList vertexlist;protected int adjmatrix;protected int visit;private final int MAX_WEIGHT=99999;*public String activeperson()/活跃人物int max=-1;int line=-1;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度总和函数,来计算每个人的出度总和也就是某个人发出邮件的数量,找出其中发送邮件数量最大的人作为活跃人物。*public String mainperson()/核心人物int temp = new int this.outdegres().length;int max=-1;int line=-1;for(int i=0;ithis.outdegres().length;i+)tempi=this.outdegres()i+this.indegres()i;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度和入度总和函数,来计算每个人的出度和入度总和也就是某个人发出和接收邮件的数量,找出其中发送和接收邮件数量最大的人作为活跃人物。*public String marginalperson()/边缘人物int temp = new int this.outdegres().length;int min=99999;int line=-1;for(int i=0;ithis.outdegres().length;i+)tempi=this.outdegres()i+this.indegres()i;for(int i=0;itemp.length;i+)if(tempimin)min=tempi;line=i;return (String)this.get(line);利用AdjMatrixGraph中的某个人的出度和入度总和函数,来计算每个人的出度和入度总和也就是某个人发出和接收邮件的数量,找出其中发送和接收邮件数量最小的人作为活跃人物。*public boolean isExist(String temp,String str,int t)/是否存在该人for(int i=0;it;i+)if(tempi.equals(str)return true;return false;在查找某人的圈子时候,判断此人是否已经有过此人。*public String group_one(String vertices,String str)/个人的圈子String init=this.group(vertices, str);int count=0;while(initcount!=null)count+;String temp=new Stringcount;for(int i=0;icount;i+)tempi=initi;return temp;调用group()函数利用返回值的String类进行整理,截取前面的内容丢弃null。*public String Connecter()/桥接人int count=0;for(int i=0;i=2)count+;String connector = new Stringcount;count=0;for(int i=0;i=2)connectorcount=(String)this.get(i);count+;return connector;在访问小团体teamgroup()的时候,声明的visit数组来计算每个人访问的次数,在visit中的值大于等于2的时候此人就处于两个团体之中,也就是作为桥接人。*public String group(String vertices,String str)/圈子String temp = new Stringvertices.length;int location=-1;int count=0;for(int i=0;ivertices.length;i+)if(verticesi.equals(str)location=i;break;for(int i=0;ivertices.length;i+)if(this.adjmatrixlocationi!=0 & this.adjmatrixlocationi!=MAX_WEIGHT)tempcount=(String)this.get(i);count+;for(int i=0;ivertices.length;i+)if(this.adjmatrixilocation!=0 & this.adjmatrixilocation!=MAX_WEIGHT)if(!this.isExist(temp, (String)this.get(i),count)tempcount=(String)this.get(i);count+;return temp;查找制定人在邻接矩阵中的i行j列的位置,记录位置。执行循环,第一次查找制定人所在行和列数值不为0和99999的数,记录个数,建立特定的数组。第二次,再次循环把行和列数值不为0和99999的数的特定人赋值到数组中,返回数组。*public String teamgroup()/小团体int temp = this.team();int count=0;for(int i=0;itemp.length;i+)if(!(tempi0=0 | tempi1=0)count+;String group=new String counttemp.length/2;int t=count;count=0;for(int i=0;itemp.length & countt;i+)if(!(tempi0=0 | tempi1=0)for(int j=0;tempij!=0;j+)groupcountj=(String)this.get(tempij-1);count+;return group;接收team()传回来的数组,进行处理,截断输出。*public int team()/团体visit = new intthis.vertexCount();int temp = new intthis.vertexCount()this.vertexCount();for(int i=0;ithis.vertexCount();i+)if(visiti=0)tempi0=i+1;visiti+;int t=1;for(int j=0;jthis.vertexCount();j+)if(this.isConnection(temp, i, j, t)tempit=j+1;visitj+;t+;return temp;先指定一个对象,从这个对象开始,先从此对象发送过的邮件人中查找,当某一个对象拜访过后,其对应visit中的值加1,查找与这一个对象有联系的人,有联系的人为有过邮件上的往来的人,利用isConnection()的方法进行,如果此人定义为有联系的人,把这个人的坐标存入temp的数组中,再进行下一步的查找,查找到另一个时,要确定这个人是否与temp数组中的人都有过邮件上的往来,如果都有就存入temp数组,没有就丢弃。这一对象查找完毕后,查找下一对象,在查找下一对象之前,先访问这一对象的visit数组中的值是否为0,只有当他没有访问过时,才能从这一对象开始查找。最后访问所有的对象,并返回数组。*public boolean isConnection(int temp,int i,int j,int t)/是否与其他人有联系int flag=0;for(int m=0;mt;m+)if(this.adjmatrixtempim-1j!=0 & this.adjmatrixtempim-1j!=MAX_WEIGHT & this.adjmatrixjtempim-1!=0 & this.adjmatrixjtempim-1!=MAX_WEIGHT)flag+;if(flag=t)return true;else return false;利用传回来的temp数组判断联系人与数组中的所有人是否两两存在邮件上的往来,返回boolean值。import_email类:*public Edge import_email_edges()/从文件中读取出信息存入边的数组public String import_email_vertices()/从文件中读取出信息存入顶点的数组public boolean isExists(String str,String word,int t)/判断这个顶点是否存在public int vertices_where(String str,String word)/查找这个值的顶点值在哪JFrame:*public MainFrm()/主界面public GroupFrm(String str) /查找小团体界面public SpecialPersonFrm() /查找特殊人界面public TeamGroupFrm()/查找桥接人界面五、 调试分析1)问题和改进【问题&改进1】小团体与桥接人的定义小团体:在小团体中,每个人都要与剩余的其他人进行两两的邮件收发。桥接:在两个或者多个小团体中都出现的人物。【问题&改进2】桥接人的寻找如果是在查找完小团体之后,在从小团体之间找出共用的桥接人,就会对所有的小团体进行排序查找算法,这样会影响算法的效率。所以我运用了visit数组,如果此对象经过了拜访,其对应的值就加1。最后,在查找桥接人的时候只要查找visit数组中拜访次数大于等于2的情况就可以了,大大节省时间。【问题&改进3】Boolean值函数的使用在使用Boolean值函数进行判断该成员是否在数组内的时候一直出现空指针的问题,最后发现是数组中的值还没有填满的情况下使用数组.length方法会发生空指针的问题,所以我在接下来的使用中,使用count数值来统计已经存放了多少数据,并在函数调用的时候传入count值作为循环结束条件。2)时间&空间复杂度1.时间复杂度public int outdegres()-O(n2)public int indegres()-O(n2)public String activeperson()-O(n)public String mainperson()-O(n)public String marginalperson()-O(n)public boolean isExist()-O(n)public String group_one()-O(n)public String Connecter()-O(n)public String group()-O(n2)public String teamgroup()-O(n)public int team()-O(n3)public boolean isConnection()-O(n)2.空间复杂度public int outdegres()-O(n)public int indegres()-O(n)public String activeperson()-O(1)public String mainperson()-O(1)public String marginalperson()-O(1)public boolean isExist()-O(1)public String group_one()-O(n)public String Connecter()-O(1)public String group()-O(n)public String teamgroup()-O(n)public int team()-O(n)public boolean isConnection()-O(1)六、 测试结果34七、 结论在本次程序的编写过程中,我先对题目进行分析,也对程序的要求进行分析,确定小团体、桥接人、活跃人物、核心人物、边缘人物的定义。接着开始程序大体框架的搭建和所要运用的类进行定义。我编写程序中,有不清楚的地方就询问老师来帮助我完成要求,对E-mail的处理操作和文件读取操作是以前没有学过的,所以我就上网找资料自主学习这个操作,并在程序中使用。在程序编写的时候我要先处理实验测试数据,在实验测速数据的处理方面先画出图,然后再进行测试数据的编写。我要接近真实的电子邮件环境,所以对测试数据的要求就大大增加了。在以后的编写中多多使用“断点”进行编译和执行,可以大大提高编写效率。这一次的课程设计中,我收获了很多,希望在今后的编程中有所使用。八、 附录:程序设计源代码package project;public class AdjMatrixGraph protected SeqList vertexlist;protected int adjmatrix;protected int visit;private final int MAX_WEIGHT=99999;public AdjMatrixGraph(int size)size=size10?10:size;this.vertexlist=new SeqList(size);this.adjmatrix=new intsizesize;for(int i=0;isize;i+)for(int j=0;jsize;j+)this.adjmatrixij=(i=j)?0:MAX_WEIGHT;public AdjMatrixGraph(T vertices,Edge edges)this(vertices.length);if(vertices=null)return;for(int i=0;ivertices.length;i+)insertVertex(verticesi);if(edges!=null)for(int j=0;jedges.length;j+)insertEdge(edgesj);public int vertexCount()return this.vertexlist.length();public int getWeight(int i,int j)return this.adjmatrixij;public T get(int i)return this.vertexlist.get(i);public String toString()String str=顶点集合:+this.vertexlist.toString()+n 邻接矩阵 n ;int n=this.vertexCount();for(int i=0;in;i+)for(int j=0;jthis.adjmatrix.length)int temp=adjmatrix,i,j;this.adjmatrix=new inttemp.length*2temp.length2;for(i=0;itemp.length;i+)for(j=0;jtemp.length;j+)this.adjmatrixij=tempij;for(j=temp.length;jtemp.length*2;i+)this.adjmatrixij=MAX_WEIGHT;for(i=temp.length;itemp.length*2;i+)for(j=0;j=0&i=0&i!=j)if(this.adjmatrixij=MAX_WEIGHT)this.adjmatrixij=0;this.adjmatrixij+=weight;public int outdegres()int temp = new intthis.adjmatrix.length;for(int i=0;ithis.adjmatrix.length;i+)for(int j=0;jthis.adjmatrix0.length;j+)if(this.adjmatrixij !=MAX_WEIGHT)tempi=tempi+this.adjmatrixij;return temp;public int indegres()int temp = new intthis.adjmatrix.length;for(int i=0;ithis.adjmatrix0.length;i+)for(int j=0;jthis.adjmatrix.length;j+)if(this.adjmatrixji !=MAX_WEIGHT)tempi=tempi+this.adjmatrixji;return temp;public String activeperson()int max=-1;int line=-1;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);public String mainperson()int temp = new int this.outdegres().length;int max=-1;int line=-1;for(int i=0;ithis.outdegres().length;i+)tempi=this.outdegres()i+this.indegres()i;for(int i=0;imax)max=this.outdegres()i;line=i;return (String)this.get(line);public String marginalperson()int temp = new int this.outdegres().length;int min=99999;int line=-1;for(int i=0;ithis.outdegres().length;i+)tempi=this.outdegres()i+this.indegres()i;for(int i=0;itemp.length;i+)if(tempimin)min=tempi;line=i;return (String)this.get(line);public boolean isExist(String temp,String str,int t)for(int i=0;it;i+)if(tempi.equals(str)return true;return false;public String group_one(String vertices,String str)String init=this.group(vertices, str);int count=0;while(initcount!=null)count+;String temp=new Stringcount;for(int i=0;icount;i+)tempi=initi;return temp;public String Connecter()int count=0;for(int i=0;i=2)count+;String connector = new Stringcount;count=0;for(int i=0;i=2)connectorcount=(String)this.get(i);count+;return connector;public String group(String vertices,String str)String temp = new Stringvertices.length;int location=-1;int count=0;for(int i=0;ivertices.length;i+)if(verticesi.equals(str)location=i;break;for(int i=0;ivertices.length;i+)if(this.adjmatrixlocationi!=0 & this.adjmatrixlocationi!=MAX_WEIGHT)tempcount=(String)this.get(i);count+;for(int i=0;ivertices.length;i+)if(this.adjmatrixilocation!=0 & this.adjmatrixilocation!=MAX_WEIGHT)if(!this.isExist(temp, (String)this.get(i),count)tempcount=(String)this.get(i);count+;return temp;public String teamgroup()int temp = this.team();int count=0;for(int i=0;itemp.length;i+)if(!(tempi0=0 | tempi1=0)count+;String group=new String counttemp.length/2;int t=count;count=0;for(int i=0;itemp.length & countt;i+)if(!(tempi0=0 | tempi1=0)for(int j=0;tempij!=0;j+)groupcountj=(String)this.get(tempij-1);count+;return group;public int team()visit = new intthis.vertexCount();int temp = new intthis.vertexCount()this.vertexCount();for(int i=0;ithis.vertexCount();i+)if(visiti=0)tempi0=i+1;visiti+;int t=1;for(int j=0;jthis.vertexCount();j+)if(this.isConnection(temp, i, j, t)tempit=j+1;visitj+;t+;return temp;public boolean isConnection(int temp,int i,int j,int t)int flag=0;for(int m=0;mt;m+)if(this.adjmatrixtempim-1j!=0 & this.adjmatrixtempim-1j!=MAX_WEIGHT & this.adjmatrixjtempim-1!=0 & this.adjmatrixjtempim-1!=MAX_WEIGHT)flag+;if(flag=t)return true;else return false;package project;public class Edge implements Comparablepublic int start,dest,weight;public Edge(int start,int dest,int weight)this.start=start;this.dest=dest;this.weight=weight;public String toString()return (+start+,+dest+,+weight+);public int compareTo(Edge e) if(this.start!=e.start)return this.start-e.start;return this.dest-e.dest;package project;public class SeqListprivate Object element;private int len;public SeqList(int size)this.element=new Objectsize;this.len = 0;public SeqList(SeqList list)this(list.len);this.len=list.len;public SeqList()this(64);public boolean isEmpty()return this.len=0;public int length()return this.len;public T get(int i)if(i=0&i=0&i0)str += this.element0.toString();for(int i=1;ithis.len;i+)str +=,+this.elementi.toString();return str+);public void insert(int i, T x)if(x=null)return;if(this.len=element.length)Object temp = this.element;this.element=new Objecttemp.length*2;for(int j=0;j temp.length;i+)this.elementj=tempj;if(ithis.len)i=this.len;for(int j=this.len-1;j=i;j-)this.elementj+1 = this.elementj;this.elementi=x;this.len+;public void append(T x)insert(this.len,x);public T remove(int i)if(this.len=0|i=len)return null;T old = (T)this.elementi;fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年移动互联网应用开发考试试题及答案
- 2025年数据科学与大数据技术课程考试试卷及答案
- 2025年农村经济管理师资格考试试卷及答案
- 2025年美术教师专业技能考试试题及答案
- 2025年教育科技在课堂应用能力考核试卷及答案
- 2025年教师资格证考试卷及答案
- 2025年非洲文化与贸易研究生入学考试试卷及答案
- 2025年高层管理人员沟通技巧考核试题及答案
- 正规煤炭运输合同
- 2024年度浙江省护师类之主管护师自我检测试卷B卷附答案
- 改革开放与新时代智慧树知到期末考试答案2024年
- 教师如何促进学生自主学习
- 心肌梗死护理教学查房
- 2024年部编版七年级下册语文第一单元综合检测试卷及答案
- 摄影专业教学大纲
- 长沙市芙蓉区2023年四年级上学期《数学》期末真题和参考答案
- 岗位之间工作衔接配合安全与职业卫生事项课件
- 岩土工程勘察中钻探工艺的选取
- 华为IPD流程管理
- 监理抽检表 - 04路基土石方工程
- 《防雷电安全知识》课件
评论
0/150
提交评论