301
社区成员
发帖
与我相关
我的任务
分享覆盖率测试:基于代码覆盖率构造数据,覆盖所有分支
边界测试:构造最值、零、负数等数据
随机生成:生成随机数据进行测试,覆盖范围更大
压力测试:构造复杂的关系图,并加入大量查询指令,进行运行时间上的压力测试
直接在MyNetwork类中新增容器private final HashMap<Integer, HashSet<Integer>> map;实现;key是personId,value是存储该person的accquaintanceId的HashSet
除此之外,还实现了并查集disjointSet,主要用于查询两person之间是否间接联系(即支持isCircle),同时维护blockSum和tripleSum
在增删person/relation时需要对图模型进行维护,特别要注意的是:对于并查集的维护,在这里可以采取脏位 + 查询时重建的方式,减小整体的时间开销
在这次作业中出现了两个TLE的bug,第一次是因为容器选择不当,第二次是因为遍历方式不当
在对并查集进行dfs染色时,visited数组错误使用了ArrayList容器;并没有注意到visited.contains(id)是遍历查询,导致出现超时;
修复情况:用HashSet实现visited数组
queryTagValueSum时,选择了双重遍历persons数组,没有考虑到O(n^2)的复杂度会导致超时
修复情况:内层遍历改为遍历外层person的accuqiantance
对规格与实现分离的理解:规格是指规定了要实现的功能以及副作用等,而具体实现可以有多种方法
仔细阅读规格信息,对于每一条都要进行针对性的测试设计;规格包含前置条件,副作用范围,后置条件,对于这三个条件都要进行针对性的测试
在本单元中最大的收获应该是时间复杂度分析,以及学习到了一些很精妙的图算法实现。除此之外,也深刻的意识到了充分测试的必要性,也深刻的意识到了构造全面的测试的困难性x(因为总是容易遗漏一些东西导致卡在某几个case上很久)
JML看似给出了实现方法,但是具体的实现方式还需要自己斟酌考虑;与此同时,对JML的理解需要一定时间,有一定的阅读门槛x 如果阅读不够仔细也容易出现理解错误,导致对整个函数乃至结构的理解出现偏差。