利用Hash来提高查找的效率
在测试Lab5的IO性能时,我发现了一个问题……
我之前根本没考虑过性能问题,所以即使IO读写只需要几秒钟,但是模型加载出来就不知道什么时候了。不管怎么样,抱着试一试的心态,把代码里面一个明显没用的代码删掉以后尝试跑了一下(防止违法CkeckRep),跑了几分钟没出结果,注入了一些代码后再跑然后就吃饭去了。等到吃完饭回来发现:
(还没跑出来)
emmmmmm...

这特喵跑个蛇!
好吧开始改
一、CheckRep以及无用的BFS
在添加关系时,我使用的是将关系一条条地调用addRelation方法。其中addRelation方法,我先加入关系后,重新BFS标记每个人的轨道号,然后checkRep。
于是出现了一个问题:79w条关系的加入,那就是79w次bfs加79w次checkRep(O(n^2)的checkRep)所以就造成了很多不必要的计算浪费。
解决:
加入一个方法,将所有的关系加完后,再进行一次BFS和checkRep。之后再跑一次:

虽然很慢但是至少有结果了,起码证明了之前删掉的东西没有造成RI被违反。嗯,挺好。
但是还不够(废话!)
二、利用好Hash(本文关键!!!)
我使用的BFS中,保存访问过的结点时,使用的visited集合是List。这导致了严重的性能浪费:
visited集合包含结点A,则说明结点A访问过。我只需要使用visited的contains方法。我直接使用了一个list来存储。不难推测,list的contains方法是需要对其进行遍历的。
于是我想起了hash。
判断集合S是否包含元素a时,使用list需要遍历该表,时间复杂度为线性级别。而使用hash时,只要hashcode计算得不是太差(冲突太多),就能在常数时间内确定。
于是我将visited从ArrayList改成HashSet后,再次运行:

好的舒服了。

浙公网安备 33010602011771号