【发布时间】:2018-12-04 21:43:34
【问题描述】:
假设我有一堂课:
data class User(val userId: String, val roles: List<String>)
另外,我有一些字符串sessionId,我需要O(1) 时间来通过sessionId 和userId 检索数据。
我认为BiMap<String, User> 会解决我的问题,但用户搜索不是O(1),因为我需要先将User 转换为userId。
另一种解决方案是覆盖 User 的哈希码/等于,这将只考虑 userId,但这是一个肮脏的 hack。
【问题讨论】:
-
一个
Map<String, int>从sessionId到userId和第二个Map<int, User>从userId到User怎么样? -
"按用户搜索不是 O(1),因为我需要先将 User 转换为 userId。"那没有意义。演员表的复杂度为 O(1)。并且有两个 O(1) 操作仍然使整个算法 O(1) 为好。
-
@ErwinBolwidt 我需要迭代所有元素,转换它们(N)然后进行搜索(1),还是我错了?你能详细说明一下吗?
-
您需要了解有关复杂性的更多信息。即使你顺序组合一千个步骤,每个步骤都是 O(1),得到的算法仍然是 O(1)。
-
当您想“按用户搜索”以获取会话 ID 时,您的输入究竟是什么?角色列表是搜索输入的必要部分吗?如果不是,那么从 UserId 到 SessionID 的第二个映射是一个有效的解决方案。如果您愿意,您可以将两个映射包装在一个外观类中,以使它们保持同步。或者,如果它符合您的业务逻辑的其余部分,则按照您的建议使用 equals() 也会很好。
标签: java algorithm data-structures kotlin hashmap