当前位置: 首页 > 知识库问答 >
问题:

基于长值的HashMap,get/put o(1)?

龚寂弦
2023-03-14

因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面。

例如,一个玩家想要“通知”另一个玩家,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后循环遍历整个玩家列表数组,比较姓名的长值,然后将其发送给找到的玩家。

我的想法是创建一个HashMap,它使用长值作为键来保证o(1)查找,尽管这只是一个概念,我还没有尝试过。

(我在登录时存储name的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名玩家,所以像这样的操作真的是一个瓶颈

共有3个答案

贺宝
2023-03-14

我同意Necreaux的观点

如果你想得到答案,在没有任何共谋的情况下,你可以得到O(1)的时间复杂度,但在java中,检测和纠正冲突HashMap也使用Equals方法,并且渐进地你仍然可以说它是O(1)的

这可能会帮助你找到更多的细节

鲜于念
2023-03-14
  1. Maps可以使用字符串作为键,非常快,我认为它使用字符串的哈希代码。您也不必处理哈希代码冲突,因为它会在内部处理冲突。没有发出内部哈希冲突错误的集合类型

关于HashMap如何工作的简短描述:https://stackoverflow.com/a/18030257/357403

胥英奕
2023-03-14

听起来你想得太多了。String已经有了一个hashcode函数,那么为什么需要将其重新定义为long函数呢?您可以直接将名称作为键添加到HashMap中。

 类似资料:
  • 我正在尝试使用一个以我的类单元格为键的HashMap。但是,在将项放入HashMap之后,对该项调用contains将返回false。 这会打印出false和true,在这里应该打印true和true,因为根据映射,docs containsKey使用.equals()。我做错了什么?

  • 问题内容: Java是否有(或有可用的库)允许我拥有基于磁盘的HashMap?它不需要是原子的或任何东西,但是它将通过多个线程进行访问,并且如果两个线程同时访问同一个元素,则不会崩溃。 有人知道吗? 问题答案: 无论是属性文件或Berkeley DB的 可能是你在找什么。在自身实现,并提供了一些方法来从和到一个文件中。通常建议将Berkeley DB作为轻量级键/值对数据存储。

  • 我试图用这个键得到一个值。我正在使用get()方法。我的密钥是由int和String组成的对象。所以我提出反对 我收到了空的。当我查看去bug模式或打印密钥集时,我收到类似的消息 虽然我的钥匙应该是 为什么键看起来像这样而不是以及如何使用键获取值? 我在键中覆盖了字符串methid。它看起来更好,但我仍然有空值,我相信有一些价值。

  • 问题内容: 我在Java中具有以下哈希图: 我应该如何对哈希图进行排序,以便考虑字母和数字? 生成的哈希图应如下所示: 感谢帮助! 问题答案: 使用排序: 它将自动放置按键排序的条目。我认为自然排序适合你的情况。 注意,由于查找优化,不会保留顺序。

  • 现在,当我尝试运行它时,结果是这样的:

  • 我的最终目标是使用标准Java集合作为基准,为几个Java基本集合库创建一套全面的基准。在过去,我曾使用循环方法编写这类微基准测试。我将我正在进行基准测试的函数放在一个循环中,并迭代100万次,这样jit就有机会预热。我取循环的总时间,然后除以迭代次数,得到一个对我正在进行基准测试的函数的单个调用所需时间的估计值。在最近阅读了JMH项目,特别是这个例子:JMHSample_11_循环之后,我看到了