如何通过结对编程与Git实战提升软件工程实验技能?
摘要:Lab 1实验报告 实验要求 1 .读入文本并生成有向图: 将文本数据转换为有向图结构,各单词作为节点,有向边表示单词在文本中的相邻关系及其出现次数。 2. 展示有向图: 图形化展示生成的有向图,并可保存为图形文件。 3. 查询桥接词: 查
Lab 1实验报告
实验要求
1 .读入文本并生成有向图:
将文本数据转换为有向图结构,各单词作为节点,有向边表示单词在文本中的相邻关系及其出现次数。
2. 展示有向图:
图形化展示生成的有向图,并可保存为图形文件。
3. 查询桥接词:
查询两个单词之间的桥接词,即图中存在两条边word1→word3和word3→word2,则称word3为word1和word2的桥接词。
4. 根据桥接词生成新文本:
在输入的新文本中插入旧图得到的桥接词,生成新的文本。
5. 计算两个单词之间的最短路径:
计算图中两个单词之间的最短路径,并突出显示路径。
6. 随机游走:
从图中随机选择一个节点,进行随机游走,记录路径并展示结果。
待求解问题描述
输入数据:
是纯英文的一个txt文件,可分为多行。读取文本时,换行符、回车符、标点符号以及任何非字母字符均被忽略,仅仅读入单词。
输出数据:
一个有向图,且支持依据该图进行多种操作。具体的输出有:
展示有向图、查询桥接词、根据桥接词生成新文本、计算最短路径、随机游走路径。
约束条件:
1. 有向图的结点为文本的单词,边的方向体现文本中相邻两个单词出现的顺序,边的权重体现按此顺序相邻的一对单词的出现次数,
2. 所有的操作均在文本文件生成的有向图上进行。
3. 程序以命令行或GUI方式交互,并满足所有功能需求。
算法与数据结构设计
设计思路与算法流程图
模块1:根据文本生成图
算法步骤:
打开并读取文本文件。
将文本中的所有非字母字符替换为空格,并将其转换为小写。
按空格分割文本,生成单词数组。
遍历单词数组,相邻的单词之间生成边。
将每对相邻单词添加到图中,并记录边的权重(即相邻出现的次数)。
流程图:
模块2:展示图
算法步骤:
初始化图形界面组件。
计算每个节点的位置(例如,圆周分布)。
绘制每个节点及其标签。
遍历图的边,绘制每条边及其权重。
如果是有向图,绘制箭头表示方向。
流程图:
模块3:查询桥接词
算法步骤:
输入两个单词 word1 和 word2。
检查这两个单词是否在图中。
遍历 word1 的邻接节点,检查是否有共同的邻接节点与 word2 相连。
如果找到,记录并返回桥接词列表;否则,返回提示信息。
流程图:
模块4:根据桥接词生成新文本
算法步骤:
输入新文本。
将新文本按空格分割成单词数组。
遍历新文本的每对相邻单词。
查找每对相邻单词的桥接词,并将其插入两者之间。
返回新的文本。
流程图:
模块5:计算最短路径
算法步骤:
输入起始单词和终止单词。
使用 Dijkstra算法计算最短路径。(具体算法流程在流程图给出)
返回最短路径及其长度。
流程图:
模块6:随机游走
算法步骤:
选择起始节点
执行随机游走
返回游走路径。
流程图:
数据结构设计
主要使用了以下几种数据结构来构建和操作有向图:
Map (HashMap):用于存储图的邻接表和节点。
Node:表示图中的节点。
PriorityQueue:用于实现 Dijkstra 算法的优先队列。
有向图的数据结构
Node 类:
word:表示节点的名称或标识符,这里是一个单词。
distance:用于 Dijkstra 算法,表示从起点到该节点的当前已知最短距离。
Graph 类:
nodes:使用 Map<String, Node> 来存储图中的所有节点,键是节点的名称,值是节点对象。
adjList:使用 Map<String, Map<String, Integer>> 来表示邻接表,键是节点的名称,值是一个嵌套的 Map,表示该节点的邻接节点及其边的权重。
Dijkstra 算法的数据结构
PriorityQueue:用于实现 Dijkstra 算法的优先队列。
PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(Node::getDistance));
distances 和 previousNodes:用于记录从起点到每个节点的最短距离和路径。
