所以我有一个游戏,我将玩家对象放入数组后登录,我在速度方面没有太大的麻烦,因为我也存储了播放器的数组索引,但在某些系统我快速地遇到麻烦。
E.G。一个玩家想要“消息”另一个玩家,客户端发送一个包含该人名称的数据包,就像一个唯一的长值,然后循环遍及整个玩家列表数组并比较名称的长值并将其发送给找到的之后的球员。
我想加快这个速度是为了创建一个HashMap,它使用Long值作为保证o(1)查找的关键,虽然这只是一个概念,我还没有尝试过。
(我在登录时存储nameHash / long值,因此计算它不会成为瓶颈)
这是否可以保证o(1)查找并且该字符串的长值是否真的独一无二?
String to long(int64)方法 - >
public static long toLong(String s) {
long l = 0L;
for(int i = 0; i < s.length() && i < 12; i++) {
char c = s.charAt(i);
l *= 37L;
if(c >= 'A' && c <= 'Z') l += (1 + c) - 65;
else if(c >= 'a' && c <= 'z') l += (1 + c) - 97;
else if(c >= '0' && c <= '9') l += (27 + c) - 48;
}
while(l % 37L == 0L && l != 0L) l /= 37L;
return l;
}
游戏时间为600毫秒,与300/400玩家一起运行,因此这样的操作确实是一个瓶颈
答案 0 :(得分:3)
听起来你在思考它。 String已经有一个哈希码函数,那你为什么需要重新发明它呢?您可以直接在HashMap中添加名称作为键。
答案 1 :(得分:0)
containsKey
则为O(1),而不是数组迭代,可以在O(n)和O(n 2 )之间取决于你的代码),但恕我直言,更重要的问题是你的应用程序所需的并发性。如果您从多个线程使用此集合,则可以考虑使用ConcurrentHashMap。关于HashMap如何运作的简短描述:https://stackoverflow.com/a/18030257/357403
答案 2 :(得分:0)
我同意Necreaux
如果你想要答案,没有任何勾结,你可以有O(1)时间复杂度,但在java中检测和纠正碰撞HashMap也使用Equals方法,渐渐地你仍然可以说它&#39; O(1)
This可能会帮助您找到更多详情