【问题标题】:Find a User by name quickly按名称快速查找用户
【发布时间】:2014-04-21 07:53:46
【问题描述】:

我有一个管理游戏用户的 C++ 服务器。这些用户具有唯一的 AccountID,几乎每次在服务器上查找用户都涉及从

的全局映射中查找用户
std::map<unsigned int, User*>

其中 unsigned int 是 AccountID。这很好用,除了我正在实施朋友列表的这个新案例。为了将朋友添加到某人的朋友列表中,需要通过用户名完成。当通过用户名邀请人们参加聊天室或其他“聚会”类型的活动时,我也遇到了这个问题。

我目前的两个选择是:

1) 遍历整个用户映射,按用户名进行字符串比较。

2) 对索引的 Username 列进行数据库查找并返回 AccountID,然后为 User* 进行映射查找。

这两种解决方案都非常低效。我正在寻找一种更优化的按用户名查找用户的解决方案。

想到的第一个想法是对用户名进行哈希处理的哈希表,但是我有两个不同的数据结构(哈希表和地图)做同样的事情,除了一个是按 AccountID 的,一个是按名称的.

第二种选择可能是使用用户名作为地图的键,尽管我无法想象使用字符串作为键的效率太高。

对我应该在这里做什么有什么建议吗?至于服务器上的一些更多信息,大约有 1000+ 用户,他们会不断地离开和加入。

【问题讨论】:

    标签: c++ map hashtable


    【解决方案1】:

    C++11 有std::unordered_map,它会自动为你处理散列,例如std::unordered_map&lt;std::string, User*&gt;.

    【讨论】:

    • std::unordered_map 是 STL 的哈希表吗?据我所知,一个哈希表将接近恒定的查找时间(假设一个好的哈希很少有冲突,不确定内置的哈希函数有多好),而 std::map 将是 log(n) 时间。我想这是一个更优化的解决方案,假设哈希表很平衡,并且还解决了我的用户名查找问题。
    • 作为后续,最坏情况的哈希表可能是 O(n)(所有元素发生冲突),我如何确保从随机用户名中获得平衡良好的哈希表?
    • 你不能确定,但​​是如果hash方法是合理的,最坏的情况太不可能了,你真的不必在意。
    【解决方案2】:

    我建议只使用另一张地图std::map&lt;std::string, User*&gt;。我相信对于一个拥有约 1000 个用户的应用程序来说,做 hashmap 或更复杂的解决方案是过度设计的,在 map 中基于字符串的查找不会那么昂贵,与在数据库中查找相比几乎为零。

    也许,您也可以在某处使用按字母排序的用户的副产品。

    【讨论】:

    • 1000 个用户是当前的用例,它将会扩展很多。可能有大约 10,000 个用户。很抱歉造成混乱。
    • 假设您将有 100k 个用户,查找是 O(log(n)) 个字符串比较,因此您可以期望在 13-14 个比较之间从地图中获取用户。我个人会这样做,如果它成为性能瓶颈,我会将其更改为其他内容。我个人怀疑它会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2020-04-13
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多