面向对象第三单元总结
一、实现规格所采取的设计策略
由于本单元作业均已给出JML规格,因此代码的基本架构是按照JML规格来写的,当有一些实现起来比较复杂的方法时,比如要进行图的查找计算,就需要新增一些方法来帮助自己更好的实现。
JML规格的编写,是面向这个方法或者类要完成什么样的功能,因此具体代码的实现方式要多加思考,不能照猫画虎,JML规格中会有很多与容器容量、顺序、存在性有关的内容,我们要思考自己的容器是否符合要求。JML规格为保证代码的易读性和规整性,提供的实现方式仅供参考,我们可以减少一些不必要的遍历,让自己的程序性能更好。
二、测试方法和策略
测试方法主要以构造数据为主。首先是要测试自己的代码是否存在问题,构造代码要全面,每一条指令都要进行测试。但在第二次作业中,我自己构造了一些数据进行测试,但强侧被发现bug,这主要是因为本单元的输出比较有迷惑性,而且涉及很多有关容器的操作,有时候可能正常方法执行完成,标准输出也显示正确,但是相关的对象并没有按照想要的顺序,位置插入容器中。测试这类bug,一是靠大量数据测试,容器操作不当会触发数组越界等问题,二是自己增加更多标准输出,观察自己对容器的操作是否正确。
其次是性能问题,我认为这一点测试意义不大,避免超时的最主要方法还是让算法更高效,评测机与我们的计算机性能不一,很难发现超时问题,只要我们能够保证方法复杂度不会达到O(n^2)的级别,基本不会出现超时问题。因此我构造的一些用来测试超时的代码主要用于互测中。
三、容器选择和使用的经验
本单元的一个特点是Person Message Group等类,都有一个id成员作为唯一表示,因此采取Map类型存储,可以简化对对象的存取、查找。Map类型不允许在遍历过程中增添和删除,对于涉及增删的方法,可使用迭代器实现。Person类中的Message对添加的先后顺序有较高要求,因此使用了LinkedList类来简化操作。
同时,有一些相关的集合可以进行合并,person类中,对于acquaintance集合中的人,都对应着一个路径值,我们可以使用Map类,将人和value联系在一起,可以更便捷地计算路径值。Network中的emoji,规格中给出了两个集合,分别id和热度值,我们可以使用Map将其联系在一起,不必考虑两个集合的顺序问题。在迪杰斯特拉算法中,set类型可以作为每一个节点是否被访问的标示,PriorityQueue有助于优化算法。
四、性能问题
第一次作业
第一次作业的主要问题是计算连通块的数量,对于图,我采用了并查集的方法来判断两个节点是否连通,但是计算连通块的数量,使用了规格提供的方法,使用了两层for循环,复杂度为O(n^2),在互测中超时,解决方法是定义一个全局变量来存储连通块数量,在程序运行过程中维护,每增加一个人就增加一个连通块,每增加一条边,如果这条边的两个节点没有连通,则连通块减一。
第二次作业
第二次作业中group类中getValueSum()方法,要求计算group中每个人与同一group中的人相互连通的个数,规格给出的方法是遍历group中的每一个人,但group中的人数可以很多,假如group中有n个人,就要执行n^2次,而每个人acquaintance集合中的人数明显少于group,因此改遍历group为遍历acquaintance。
for (int i = 0;i < people.size();i++) {
Person p1 = people.get(i);
for (int j = 0;j < acquaint.size();j++) {
Person p2 = acquaint.get(j);
if (hasPerson(p2)) {
sum = sum + value.get(j);
}
}
}
第三次作业
第三次作业计算最短路径,我采用了迪杰斯特拉算法,普通的迪杰斯特拉算法复杂度为O(n^2),使用堆栈优化后复杂度为O(m+n),在此次作业中,我使用了java内置的PriorityQueue,借助堆栈进行排序。计算最短路径,不需要遍历整个图,设置截止条件,当通往目标节点的最短路径从优先队列中取出时,即为所求最短路径。
五、架构设计
本单元主要构建一个通讯网络,其核心是由Person作为节点,Value作为边权的一张图。JML规格中对图的大部分设计已经给出,addPerson增加节点,addRelation增加边,每一个Person都储存着与其直接相连的节点。在此基础上,我引入的祖先节点的概念,增加一个新的集合来储存各节点的祖先节点id,使用并查集的方式来维护这一集合,两个节点有相同的祖先节点,则两节点一定是连通的,主要用来计算连通块的数量。第二次作业引入的Group的概念,是一些节点的集合,涉及的操作并不多,重点关注计算。第三次作业涉及迪杰斯特拉算法,由于获得边权、获得节点的方法比较完善,因此实现起来并不困难。

浙公网安备 33010602011771号