oo第三单元总结
一、设计策略
第九次作业
在第九次作业中,Network中的isCircle和queryBlockSum两函数最难,这两函数的基础都是判断两节点是否在同一个集合,为此我使用了并查集,核心函数如下:

该函数在每次查找根节点的同时,更新当前节点的父节点,提高了查找效率。而在异常类中,我采用一个全局变量来记录该异常被触发的次数和一个HashMap来保存不同id所触发的异常次数。
第十次作业
新增了group和message类。而在此次新增的方法中并未涉及对算法的考察,因此我只单纯的按照JML要求的来做,并未做特殊处理。
第十一次作业
这次新增了几个Message的子类和对应得方法。其中最难的是Network类中的sendIndirectMessage,该方法要返回两点这间的最短距离,因此我采用了堆优化的dijkstra算法,核心代码如下:

二、测试的方法和策略
我先用手动构造样例测试的方式对重要的方法进行单独测试,然后用Junit对程序进行自动化测试,最后再手动构造特殊的样例来进行整体测试。
三、容器的选择与使用
本次作业的所有JML中出现容器大都采用了ArrayList,因为未灵活使用HashMap,导致查找时效率低下。
而在异常类中,我使用了HashMap来保存了每个节点所对应的触发异常次数。
通过这次作业的反思,我认识到,在查询,更新等操作较多时,应该采用HashMap的方式,用其自带的containsKey、get、put方法更容易实现,而且时间复杂度低。另外,应该多个容器混合使用,相互帮助和弥补,从而达到降低时间复杂度的目的。
四、性能问题的总结与分析
第九次作业
该次作业在queryBlockSum方法处出现性能问题的可能最大,若按照规格时间复杂度将是O(n2),而我采用了并查集,时间复杂度只有O(1)。
第十次作业
该次作业在getAgeMean方法和getValueSum方法处出现性能问题的可能最大,由于我并未采用特殊的方法,因此时间复杂度较高,都为O(n2)。
第十一次作业
该次作业在sendIndirectMessage方法处出现性能问题的可能最大,由于我采用了堆优化后的dijkstra算法,所以时间复杂度为O(VlogV)。
五、作业架构设计
类的组织
本次作业大多是实现抽象类,只有在第十一次作业里有继承具体类,继承关系如下:

图模型构建与维护策略
构建用数组来保存各节点,用Map来保存各条边。
维护策略为在Map里面增加或删除边,在数组里增加或删除节点。
六、心得与体会
本单元作业主要通过JML来锻炼我们阅读规格,完成规格的能力。此次作业让我明白了在理解规格的基础上,不一定要完全按照规格来写,有时需要一些技巧和方法来更好的完成规格要求。
本次作业整体上完成并不难,跟着规格做就行,但可能会超时。难点就在于算法和架构设计。算法方面比如并查集算法和堆优化的dijkstra算法,能有效的降低时间复杂度。架构设计方面比如容器的选择很重要,选择Map能有效的降低查询时间等等。
这个单元的作业我还算满意,很多方面都进行了优化,但在容器选择方面出了问题,因为一开始不知道规格要求的数组只是代表容器的意思,可以用Map实现,导致我大多数容器都选择的ArrayList,这样做的代价就是每次查找时都需要遍历,极大的提高了时间复杂度。但这也教会了我,并不一定要完全按照规则行动,要学会变通。

浙公网安备 33010602011771号