映射O(1)搜索键和值

时间:2018-06-26 08:29:44

标签: java algorithm data-structures kotlin hashmap

考虑我有一堂课:

data class User(val userId: String, val roles: List<String>)

另外,我有一些字符串sessionId,我需要O(1)的时间来同时sessionIduserId来检索数据。

我认为BiMap<String, User>将解决我的问题,但按用户搜索不是O(1),因为我需要先将User强制转换为userId

另一种解决方案是覆盖User的哈希码/等于,仅考虑userId,但这是一个肮脏的黑客。

1 个答案:

答案 0 :(得分:1)

User投射到userIdO(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-sessionIdUser-User之间的映射),并通过其sessionId或userId 获取用户的操作为O(1),因为您不必搜索。您可以将空间复杂度(Map的大小)换成时间复杂度(将O(n)的搜索转换为O(1)的查找。

如果您真的想进行渐进复杂性分析,建议您使用this book