数据结构课设红楼梦人物关系.docx
- 文档编号:23444379
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:36
- 大小:258.17KB
数据结构课设红楼梦人物关系.docx
《数据结构课设红楼梦人物关系.docx》由会员分享,可在线阅读,更多相关《数据结构课设红楼梦人物关系.docx(36页珍藏版)》请在冰豆网上搜索。
数据结构课设红楼梦人物关系
课程设计报告
题目:
基于社会网络分析技术的
《红楼梦》人物关系分析
课程名称:
数据结构
专业班级:
学号:
姓名:
指导教师:
报告日期:
计算机科学与技术学院
任务书
☐设计内容
用图模型设计与表示《红楼梦》人物关系网,并以文件形式保存相关信息;运用社会网络分析技术与算法对红楼梦人物关系网进行分析,获取有意义的结果,并以图形方式呈现;提供对人物属性与人物关系的查询功能。
☐设计要求
⑴设计一定的界面,能够将分析所得人物关系结果直观显示,支持人物关系的查询。
人物关系数据以文件形式保存。
若界面友好,有特色,可酌情加分。
⑵选用两种以上分析模型如核心人物分析、中心性分析、小团体分析、相似子结构分析等进行分析处理,分析模型在社会网络分析相关文献中具有严格定义,设计中对分析模型的表示与处理基于对应的定义,以避免仅从字面理解而出现不严谨、简单化的设计。
⑶设计程序中处理的不同人物数量不少于100人,并根据人物数量情况、所使用的分析模型与算法的复杂程度分易、中、难三级评分。
☐参考文献
[1]孙晓玲,林鸿飞.人际网络关系抽取和结构挖掘.微电子学与计算机,2008,25(9):
233-236
[2]杜一鸣,滕桂法,马建斌.社会网络搜索关键技术研究概述.情报分析与研究,2010,189
(2):
68-73
[3]徐伟,陈光辉,曾玉.关系研究的新取向:
社会网络分析.心理科学,2011,34
(2):
499-504
[4]张树人,刘颖,陈禹.社会网络分析在组织管理中的应用.中国人民大学学报,2006,(3):
74-80
[5]韩毅.社会网络分析与挖掘的若干关键问题研究.国防科学技术大学博士学位论文,2011.6
[6]MohsenJamaliandHassanAbolhassani.DifferentAspectsofSocialNetworkAnalysis.
[7]KateEhrlichandIngaCarboni.InsideSocialNetworkAnalysis.
[8]
[9]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997
[10]王晓东.计算机算法设计与分析.北京:
电子工业出版社,2007
任务书
1引言1
1.1课题背景与意义1
1.2国内外研究现状3
1.3程序设计的主要研究工作10
2系统需求分析与总体设计1
2.1系统需求分析1
2.2系统总体设计10
3系统详细设计20
3.1有关数据结构的定义20
3.2主要算法设计23
4系统实现与测试40
4.1系统实现1
4.2系统测试10
5总结与展望40
6体会40
参考文献44
附录程序源码45
1引言
1.1课题背景与意义
我选的课程设计题目为基于社会网络的《红楼梦》人物关系分析系统。
1.1.1课题背景
经过一个学期对数据结构这门课程的学习之后,我们被要求独立完成一份课程设计,备选题目有四个:
中国行政区域图染色与信息查询、基于社会网络分析技术的《红楼梦》人物关系分析、基于查找表的单词检索软件和简易HTML文档解析程序。
由于《红楼梦》是我很喜欢的一部文学作品,我选择了基于社会网络分析技术的《红楼梦》人物关系分析这个题目。
1.1.2意义
通过这次完成课程设计,我能更加深刻地理解图、无向图的邻接多重表存储结构和与图相关的算法(如弗洛伊德算法),将课本上的知识付诸实践,并且提高了运用知识的熟练度。
初步了解了界面的制作方法,学习了Qt的基础知识。
同时重温了《红楼梦》一书,增长了其他方面的知识。
1.2国内外研究现状
目前国内外对社会网络分析技术的研究主要是基于关系的图形结构和六度分隔理论的研究,主要有以下几种分析方法:
1、中心性分析,即通过程度中心性、亲近中心性、中介中心性三个指标,判断个体在群体中居于怎样的地位、拥有怎样的权利。
2、小团体分析,主要方法是找出关系结构图中联系相对紧密的子图成分,然后按照子图的重叠程度与关系的紧密程度进一步组合,最终确定小团体成员。
3、位置分析,即分析不同群体中的个体在群体内相似的角色作用,拥有类似的网络位置。
1.3课程设计的主要研究工作
通过查阅论文、网络搜索等方式学习社会网络分析技术的概念,找到适用于本课程设计的分析方法。
权衡难度之后,我确定了中心性分析法作为本次课程设计的主要分析方法。
之后详细学习这种分析方法,搞清楚程度中心性、亲近中心性和中介中心性三个指标应该如何求得,再查书、查XX找合适的算法。
界面方面的难度比较大,我选择用Qt做界面,但是我从未学习过C++,这给我对Qt的学习带来了许多麻烦。
我买了C++的书、在网上查了Qt的教程,一边理解面向对象的概念,一边跟着教程摸索Qt的功能,最终成功做出了(很丑的)界面。
2系统需求分析与总体设计
2.1系统需求分析
《红楼梦》人物关系系统应具有一定的界面,支持人物关系的查询(包括直接关系和间接关系),支持查询特定人物的特定关系者,支持查询人物的详细信息。
人物关系数据以文件形式保存。
用中心性分析和核心人物分析两种分析模型进行分析,能够将分析所得人物关系结果直观显示。
系统应能存储不少于100人的人物信息以及相互关系。
2.2系统总体设计
本系统应当有一个可视化菜单,链接到四个功能模块:
人物信息查询模块、人物关系查询模块、按关系搜索人物模块和人物关系分析模块。
人物信息查询模块能够搜索用户输入的人物名字,然后在界面中显示人物的基本信息。
如果未找到用户输入的人物,将显示提示。
人物关系查询模块能够查询任意两个人物之间的关系,如果两个人有直接关系(即两个结点相邻)则显示关系信息,如果两个人之间无直接关系但有间接关系(即两个结点不相邻但有通路)则显示两个人之间的关系链,即显示通路上每一结点的人物姓名。
若两个人之间无关系(即两个结点之间无通路),则显示“人物之间无关系”。
按关系搜索人物模块能够搜索并显示与任意人物有特定关系的所有人物。
如搜索与“林黛玉”有“表兄妹”关系的人,系统将显示“贾链贾宝玉”,若无搜索结果则显示“未找到!
”
人物关系分析模块有三个功能:
程度中心性分析、亲近中心性分析、中介中心性分析和核心人物分析。
程度中心性分析能够计算并显示用户搜索的人物的程度中心性,亲近中心性分析能够计算并显示用户搜索的人物的亲近中心性,中介中心性分析功能能够计算并显示用户搜索的人物的中介中心性,核心人物分析能够计算并显示系统中每个人物的程度中心性且按从小到大排序,从而分析出程度中心性最高的人物为核心人物,并显示其简介。
图2-1系统模块结构图
3系统详细设计
3.1有关数据结构的定义
系统中包含的数据如下:
表3-1系统包含的数据表
数据
数据名称
数据类型
人物姓名
name
QString
人物性别
gen
int
人物简介
cinfo
QString
人物关系信息
rinfo
QString
人物关系的人物A
ivex
QString
人物关系中的人物B
jvex
QString
系统采用邻接多重表的方式创建关系图。
个人信息结构体除了包含人物姓名、人物性别和人物简介之外,还包含一个指向第一条边的指针*firstedge,以数组的方式存储;人物关系的信息以链表方式存储,其结构体包含此边两个结点的人物姓名和两个指针*ilink和*jlink,分别指向两个结点的邻边。
3.2主要算法设计
人物信息查询模块:
系统获取用户输入的内容,遍历图并比较每一结点的人物姓名项与用户输入的内容,发现相同时,以QString的形式返回人物的其他信息,并在textBrowser中显示。
人物关系查询模块:
系统获取用户输入的内容,遍历图并比较每一结点的人物姓名项与用户输入的人物A姓名,发现相同时,遍历这一结点的所有边,并比较每条边另一结点与用户输入的人物B姓名,发现相同时,以QString的形式返回此边的人物关系信息。
若未找到直接关系,则用迪杰斯特拉算法求两个结点之间的最短通路并存储到数组中,以QString的形式返回中间人物的姓名。
按关系查询人物模块:
系统获取用户输入的内容,遍历图并比较每一结点的人物姓名项与用户输入的姓名,发现相同时,遍历这一结点的所有边,并比较每条边另一结点与用户输入的关系内容,发现相同时,以QString的形式返回此边的另一个结点内容。
人物关系分析模块:
分为四个部分,分别介绍:
程度中心性分析:
即求结点的度,再除以所有的结点数目-1,以float的形式返回程度中心性。
亲近中心性分析:
先通过迪杰斯特拉算法求出所有此结点出发的通路,将每条通路的长度相加,再求倒数,以float的形式返回亲近中心性。
中介中心性分析:
先通过弗洛伊德算法求出图中所有最短通路,并统计通过此节点的通路个数和所有通路个数,再求两个数据的比值,以float的形式返回中介中心性。
核心人物分析:
计算并显示系统中每个人物的程度中心性且按从小到大排序,从而分析出程度中心性最高的人物为核心人物,并以QString形式返回其简介。
4系统实现与测试
4.1系统实现
《红楼梦》人物关系系统应具有一定的界面,支持人物关系的查询(包括直接关系和间接关系),支持查询特定人物的特定关系者,支持查询人物的详细信息。
人物关系数据以文件形式保存。
用中心性分析和核心人物分析两种分析模型进行分析,能够将分析所得人物关系结果直观显示。
系统应能存储不少于100人的人物信息以及相互关系。
应用的数据结构及函数如下:
typedefenum{unvisited,visited}VisitIf;
typedefstructchara_info{//人物信息类型
QStringname;
intgen;//性别,1为男,0为女
QStringcinfo;//人物简介
}pers;
typedefstructEBox{
VisitIfmark;
intivex,jvex;
structEBox*ilink,*jlink;
QStringrinfo;
}EBox;
typedefstructVexBox{
persdata;
EBox*firstedge;
}VexBox;
typedefstruct{
VexBoxadjmulist[120];
intvexnum,edgenum;
}AMLGraph;
typedefstructvex_rela{
QStringivex,jvex;
QStringrinfo;
}vex_rela;
typedefstructDEG{
floatd;
intloc;
}DEG;
boolcreate_graph(AMLGraph&G,VexBoxV[],vex_relaVR[]);
voidtravers(AMLGraphG);
boolget_info(VexBoxV[],vex_relaVR[]);
intget_vex(AMLGraphG,QStringsearch);
QStringsearch_rela(AMLGraphG,QStringnamea,QStringnameb);
floatget_degree(AMLGraphG,intloc);
floatShortestPath(AMLGraphG,intv);
floatfloyd(AMLGraphG,intv0);
QStringcore(AMLGraphG);
intpartition(DEGdeg[],intlow,inthigh);
voidQSort(DEGdeg[],intlow,inthigh);
QStringfind_pers(AMLGraph,intv,QStringserela);
QStringfind_path(AMLGraphG,intv1,intv2);
voiddestroy_graph(AMLGraphG);
程序详见附录。
4.2系统测试
菜单界面:
显示四个功能
人物信息查询:
用户输入姓名,显示人物信息。
输入信息正确时:
输入信息错误时:
查找人物关系:
查询任意两个人物之间的关系,如果两个人有直接关系(即两个结点相邻)则显示关系信息,如果两个人之间无直接关系但有间接关系(即两个结点不相邻但有通路)则显示两个人之间的关系链,即显示通路上每一结点的人物姓名。
若两个人之间无关系(即两个结点之间无通路),则显示“人物之间无关系”。
按关系查询:
人物关系分析:
程序除了界面不太好看之外,基本满足了设计要求。
5总结与展望
5.1全文总结
在这次课程设计过程中,我所做的主要工作如下:
(1)通过查阅论文、网络搜索等方式学习社会网络分析技术的概念,找到适用于本课程设计的分析方法。
(2)详细学习中心性分析法,搞清楚程度中心性、亲近中心性和中介中心性三个指标应该如何求得,再查书、查XX找合适的算法。
(3)学习Qt和一些C++的知识,制作可视化界面。
5.1工作展望
这次的课程设计还有很多不尽人意的地方。
比如算法过于单一、功能比较少、界面太过简单不好看等。
在以后的课程设计中,我将更把注意力放在功能上,尽量用更好地算法写更多功能。
同时在界面的美化上下一些功夫,做出好看的界面。
6体会
通过这次完成课程设计,我能更加深刻地理解图、无向图的邻接多重表存储结构和与图相关的算法(如弗洛伊德算法),将课本上的知识付诸实践,并且提高了运用知识的熟练度。
初步了解了界面的制作方法,学习了Qt的基础知识。
同时意识到了C++等面向对象编程思想的重要性,不理解这种思想,就不能很好地使用Qt或者MFC做界面。
现在学习过的C远远不够用,还需多学一些。
参考文献
[1]孙晓玲,林鸿飞.人际网络关系抽取和结构挖掘.微电子学与计算机,2008,25(9):
233-236
[2]杜一鸣,滕桂法,马建斌.社会网络搜索关键技术研究概述.情报分析与研究,2010,189
(2):
68-73
[3]徐伟,陈光辉,曾玉.关系研究的新取向:
社会网络分析.心理科学,2011,34
(2):
499-504
[4]张树人,刘颖,陈禹.社会网络分析在组织管理中的应用.中国人民大学学报,2006,(3):
74-80
[5]韩毅.社会网络分析与挖掘的若干关键问题研究.国防科学技术大学博士学位论文,2011.6
[6]MohsenJamaliandHassanAbolhassani.DifferentAspectsofSocialNetworkAnalysis.
[7]KateEhrlichandIngaCarboni.InsideSocialNetworkAnalysis.
[8]
[9]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,1997
[10]王晓东.计算机算法设计与分析.北京:
电子工业出版社,2007
附录程序源码
function.h源码:
#ifndefFUNCTION_H
#defineFUNCTION_H
#include
#include
#include
#include
#include
typedefenum{unvisited,visited}VisitIf;
typedefstructchara_info{//人物信息类型
QStringname;
intgen;//性别,1为男,0为女
QStringcinfo;//人物简介
}pers;
typedefstructEBox{
VisitIfmark;
intivex,jvex;
structEBox*ilink,*jlink;
QStringrinfo;
}EBox;
typedefstructVexBox{
persdata;
EBox*firstedge;
}VexBox;
typedefstruct{
VexBoxadjmulist[120];
intvexnum,edgenum;
}AMLGraph;
typedefstructvex_rela{
QStringivex,jvex;
QStringrinfo;
}vex_rela;
typedefstructDEG{
floatd;
intloc;
}DEG;
boolcreate_graph(AMLGraph&G,VexBoxV[],vex_relaVR[]);
voidtravers(AMLGraphG);
boolget_info(VexBoxV[],vex_relaVR[]);
intget_vex(AMLGraphG,QStringsearch);
QStringsearch_rela(AMLGraphG,QStringnamea,QStringnameb);
floatget_degree(AMLGraphG,intloc);
floatShortestPath(AMLGraphG,intv);
floatfloyd(AMLGraphG,intv0);
QStringcore(AMLGraphG);
intpartition(DEGdeg[],intlow,inthigh);
voidQSort(DEGdeg[],intlow,inthigh);
QStringfind_pers(AMLGraph,intv,QStringserela);
QStringfind_path(AMLGraphG,intv1,intv2);
voiddestroy_graph(AMLGraphG);
#endif//FUNCTION_H
function.cpp源码:
#include
#include
#include
#include
#include
boolget_info(VexBoxV[],vex_relaVR[]){//读取文件信息
inti=0;
//QStringen;
//节点读取
QFile*vQFile(":
/");
if(!
vfile->open(Q)){
returnfalse;
}
QTextStreamvin(vfile);
V[i].data.name=vin.readLine();
V[i].data.gen=vin.readLine().toInt();
V[i].data.cinfo=vin.readLine();
//en=vin.readLine();
i++;
while(!
V[i-1].data.name.isNull()){
V[i].data.name=vin.readLine();
V[i].data.gen=vin.readLine().toInt();
V[i].data.cinfo=vin.readLine();
//en=vin.readLine();
if(++i==120)break;
}
//边读取
i=0;
QFile*vrQFile(":
/");
if(!
vrfile->open(Q)){
returnfalse;
}
QTextStreamvrin(vrfile);
VR[i].ivex=vrin.readLine();
VR[i].jvex=vrin.readLine();
VR[i].rinfo=vrin.readLine();
i++;
while(!
VR[i-1].ivex.isNull()){
VR[i].ivex=vrin.readLine();
VR[i].jvex=vrin.readLine();
VR[i].rinfo=vrin.readLine();
i++;
}
returntrue;
}
intget_vex(AMLGraphG,QStringsearch){
inti,j;
for(i=0;i<120;i++){
//j=strcmp(search,G.adjmulist[i].data.name);
j=QString:
:
compare(search,G.adjmulist[i].data.name);
if(!
j)returni;
//if(search==G.adjmulist[i].data.name)returni;
}
return-1;
}
QStringsearch_rela(AMLGraphG,QStringnamea,QStringnameb){
QStringoutput;
intm,n;
EBox*p;
intpath[G.vexnum];
m=get_vex(G,namea);
n=get_vex(G,nameb);
if(m==-1||n==-1){
return"未找到人物!
";
}
p=G.adjmulist[m].firstedge;
while(p){
if(p->ivex==m){
if(p->jvex==n)break;
p=p->ilink;
}
elseif(p->jvex==m){
if(p->ivex==n)break;
p=p->jlink;
}
}
if(!
p){
//printf("两人无直接关系!
\n\n查找间接关系:
\n");
output=find_path(G,m,n);
//if(path[1]==-1)printf("未找到两人关系!
\n");
if(output=="")return"未找到人物关系!
";
returnoutput;
}
//printf("两人关系为:
%s\n",p->rinfo);
output=p->rinfo;
returnoutput;
}
floatget_degree(AMLGraphG,intloc){
//求人物程度中心性
intdegree=0;
floatma,av;
ma=G.vexnum-1;
EBox*p;
if(G.adjmulist[loc].data.gen==-1){
//printf("不存在所查人物!
\n");
return
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 红楼梦 人物 关系