buaa oo 第三单元JML总结

针对第三单元的三次作业和课程内容,撰写的技术博客如下:

(1)总结分析自己实现规格所采取的设计策略

  • 阅读JML了解方法的含义,选择合适的容器和算法来实现JML的要求。在具体实现的时候,先对较为简单的抛异常的情况进行实现,再逐条分析JML的主体内容。
  • 对于时间复杂度较高的方法,进行必要的优化。

(2)结合课程内容,整理基于JML规格来设计测试的方法和策略

  • 基于jml规格使用junit生成测试代码,自己构造一些测试各个方法的数据,进行基本的正确性验证
  • 根据JML的要求,随机使用python生成相应的数据,和其他同学进行对拍

(3)总结分析容器选择和使用的经验

  • 在能使用哈希表的时候使用哈希表,因为哈希查找的速度特别快O(1),哈希表的键使用其id,值存储相应的对象。
  • 在第二次作业时:在JML没有显式指出容器的时候,也要尽量多地使用哈希表存储信息,如每个person所在的各个group,将这个信息存储起来,用空间换时间,可以减少程序运行的时间。
  • 在第三次作业时:在涉及到排序的过程中,使用优先队列,这样的排序是O(log(n)),比我们一般的排序要快得多,可以用来优化迪杰斯特拉算法。同时在迪杰斯特拉算法的实现过程中,优先队列不好索引,可以另外引入一个哈希表,这个容器存储已经找到的点的集合,可以排除掉在遍历过程中的一部分点,降低算法的时间复杂度。

(4)针对本单元容易出现的性能问题,总结分析原因如果自己作业没有出现,分析自己的设计为何可以避免

  • 自己的作业在三次强测和互测中均没有出现包含性能问题在内的bug。

  • 本单元第一次作业的isCircle方法容易出现性能问题,避免出现问题的方法是:使用查并集,将ICircle方法判断两个person之间是否有联系的过程分布在每次添加person的过程中,可以降低isCircle方法的时间复杂度。

  • 本单元第二次作业的计算求和和方差的方法容易出现性能问题,避免的方法是:类似于isCircle将计算的过程分布在其他方法中,用空间换时间,在第二次作业的各种方法中,这个方案可以在一定程度上降低程序运行时间。

  • 本单元第三次作业的sendIndirectMessage方法容易出现性能问题,笔者在第一次写该方法的时候,用了特别规矩的迪杰斯特拉算法,将network里面的每个person进行遍历,然后逐渐使用优先队列,但还是相比于其他同学运行时间是好几倍,然后将从p1的熟人列表的dfs算法和迪杰斯特拉算法结合,主要使用优先队列,哈希表辅助存储信息,可以显著降低程序运行时间。

(5)梳理自己的作业架构设计,特别是图模型构建与维护策略

  • 本单元作业建立在JML的基础上,留给自己的个人架构空间十分有限,程序与程序之间的主要区别在于在图模型构建和维护中容器的选择,算法的优化,空间换时间的策略等。自己的作业架构,其实在避免性能问题的方法中已经说得比较清晰了,在这里再进行系统性的总结一下。

  • 首先对于每个类需要存储的对象,笔者采用其id+对象存储在哈希表中,如熟人列表,每个person包含在的group列表,network里面存储的person,group,message等均采用这样的思路进行存储。

  • 在进行isCircle的判断时,非常考验架构和算法,否则程序运行时间容易超时,isCircle采用并查集将判断是否是环的过程分布在其他方法中。在图的构建和维护过程中保存和更新必要的信息,这样可以在进行复杂方法的执行中,降低时间复杂度,空间换时间。

  • 图模型的构建和维护在第三次作业的sendIndirectMessage方法也有很明显的应用,我们采用哈希表存储信息,以优先队列作为主要的容器,可以降低迪杰斯特拉的时间复杂度。

  • 需要注意的是,我们在维护图结构的时候,对于增删改操作,尤其是删改操作,不能忘记更新我们保存在程序中的信息,这对于我们程序的正确性至关重要,

posted @ 2021-05-28 11:11  He_RZ  阅读(77)  评论(1)    收藏  举报