利用Hash来提高查找的效率

在测试Lab5IO性能时,我发现了一个问题……

 

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

(还没跑出来)

emmmmmm...

这特喵跑个蛇!

好吧开始改

一、CheckRep以及无用的BFS

 在添加关系时,我使用的是将关系一条条地调用addRelation方法。其中addRelation方法,我先加入关系后,重新BFS标记每个人的轨道号,然后checkRep

于是出现了一个问题:79w条关系的加入,那就是79wbfs79wcheckRepO(n^2)checkRep)所以就造成了很多不必要的计算浪费。

解决:

    加入一个方法,将所有的关系加完后,再进行一次BFScheckRep。之后再跑一次:

  虽然很慢但是至少有结果了,起码证明了之前删掉的东西没有造成RI被违反。嗯,挺好。

 

但是还不够(废话!)

二、利用好Hash(本文关键!!!)

 

  我使用的BFS中,保存访问过的结点时,使用的visited集合是List。这导致了严重的性能浪费:

       visited集合包含结点A,则说明结点A访问过。我只需要使用visitedcontains方法。我直接使用了一个list来存储。不难推测,listcontains方法是需要对其进行遍历的。

         

    于是我想起了hash

判断集合S是否包含元素a时,使用list需要遍历该表,时间复杂度为线性级别。而使用hash时,只要hashcode计算得不是太差(冲突太多),就能在常数时间内确定。

 

  于是我将visitedArrayList改成HashSet后,再次运行:

  好的舒服了。

 

 

posted @ 2019-05-30 13:12  DevSum  阅读(874)  评论(0)    收藏  举报