301
社区成员
发帖
与我相关
我的任务
分享testNum次测试确保正确性。HashMap,以id为索引查找顶点和边。queryCircle和queryBlockSum,这是经典的无向图联通问题,使用dfs即可满足性能要求,在此之上的并查集可以不做优化。tripleSum,三元组,典型的维护变量,只需要在添加和删除边的时候维护即可。bestAcquaintance,直接维护即可,会导致人的关系变更的只有Person内的add、del和modify三种操作,不要遗漏即可完整维护。坑点:Integer的比较在(-128, 127)之间是可以直接比较的(JAVA自带实例化,类似BigInteger.one),但是在此之上的数值比较相等必须要用equals!!
coupleSum:在维护了bestAcquaintance之后,查询复杂度可以降到O(n)tagValueSum:比较麻烦,Tag内所有边权之和,由于不仅加减人会影响,中途改变Tag内的人际关系也会影响。只能直接查询,复杂度O(n^2)会超时。可以通过遍历点+边的方式,将复杂度变更为O(n*m),由于数据的特殊限制,边普遍远少于点,这样可以通过。总的来说因为自己大(tou)意(lan),有一些地方可以优化但是懒得优化(其实是我觉得这单元大概不是考算法),所以有一些地方超时了。稍加修改即可通过。
大意与轻敌才是最大的敌人!!
同时,在繁杂的异常处理和各种特殊情况的处理过程中,我们很容易可以发现规格分离的优势之处。通过规格分离,异常处理变得有迹可循,每个地方都限制死了副作用、入口与出口,所有的异常都已经被规划好。在某个函数中,我们不必再过多担忧诸如零值、空值之类的特殊异常情况,也避免了大量因为遗忘特殊情况导致的低级bug。
血的教训:由于过于追求数据的复杂性,生成的图永远较为复杂,进而导致测不出某个简单图才能测出的bug,被单个junit测试点卡了几个小时!!
通过这个单元的学习,我们的面向对象思想朝实际生产应用更进一步。如果说前面两个单元是磨炼我们的技巧,那么这个单元就是学会将思想技巧投入实际,更加贴近合作生产工作中。