按位置动态分组客户端,限制为最大大小

时间:2016-07-19 21:45:06

标签: java performance list collections big-o

因此,我正在开发一个项目,该项目需要迭代一组客户端进行更新,每个客户端都需要为邻近的其他客户端提供更新数据包。我希望能够以一种快速的方式做到这一点,因为大量客户端会经常发生更新。

我最初的攻击计划是根据客户位置创建区域,仅与其所在区域的其他客户更新每个客户端。这需要LinkedList<Region>,区域有自己的客户列表,它们之间会相互更新。这种方法的一个问题是一些区域可能有1个客户端,而其他区域可能有1000个。另一个难度是由于客户端将不断移动(因此改变位置和区域)。如果有一种方法可以在迭代时修改列表,可能会避免这些问题,可能会在区域变得过大时拆分元素。

接下来,我想到创建一个拥有所有玩家的大型List<Client>,这些玩家会根据位置不断进行排序。然后,为了更新列表的索引n的客户端与最近的20个客户端,我只会从当前索引迭代n-10n+10。我不太喜欢这种方法,因为如果在近距离区域有第21个客户端,即使它们与n处的客户端距离n+10的距离相同,也可以忽略它们。 }}。在每个滴答声中都必须诉诸所有客户似乎很慢。

就速度而言,哪种方法提供了更好的性能?另外,我还应该考虑其他任何Java集合吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我非常喜欢第一种方法。对每个刻度排序整个列表最终会在时间上成为一个非常糟糕的想法,这排除了第二种方法。

要解决并发问题,您应该在更新线程之前复制LinkedList<Reigon>。这样,您就可以Client在更新被推送到每个Reigon的同时更改Reigon

另一个注意事项是,如果您计划从Reigon检索任意LinkedList<Reigon>(例如,当您将ClientReigon移动到另一个foo_cached = mem.cache(foo)时应该研究某种哈希集。从列表中间检索任意元素时,它会大大提高性能,特别是如果列表很大。