考虑我有一堂课:
data class User(val userId: String, val roles: List<String>)
另外,我有一些字符串sessionId
,我需要O(1)
的时间来同时sessionId
和userId
来检索数据。
我认为BiMap<String, User>
将解决我的问题,但按用户搜索不是O(1)
,因为我需要先将User
强制转换为userId
。
另一种解决方案是覆盖User
的哈希码/等于,仅考虑userId
,但这是一个肮脏的黑客。
答案 0 :(得分:1)
将User
投射到userId
是O(1)
。如果您要进行复杂度分析,则只需要取指数最大的词,其余的就删除。
如果您执行相同的操作1000次,但始终始终执行1000次操作,则仍为O(1)
。如果操作数是恒定的并且不依赖于输入的大小,则您的复杂度为O(1)
,但是具有高恒定因子。
关于您的问题:
您可以将任意数量的Map
用作User
的查找,它仍然是O(1)
:
val sessionLookup = mapOf<String, User>()
val userIdLookup = mapOf<String, User>()
这里有两个Map
,它们将会话ID和用户ID映射到User
本身。
这里重要的是为userId
创建查找(例如:User
-sessionId
和User
-User
之间的映射),并通过其sessionId或userId 获取用户的操作为O(1)
,因为您不必搜索。您可以将空间复杂度(Map
的大小)换成时间复杂度(将O(n)
的搜索转换为O(1)
的查找。
如果您真的想进行渐进复杂性分析,建议您使用this book。