在Java 8中,是否有O(1)方法通过将V用于哈希图来获取K?我是否必须使用两个哈希图(KV和VK),如果这样的话,是否会破坏具有O(1)的目的?
对于上下文,我试图找到使用值或键(字符串userName,Integer userIdentifier)的最有效方法。
答案 0 :(得分:6)
作为一般说明-这里有一个隐藏的假设,即这些值也是唯一的。否则,您将无法通过值来检索单个键,而是键的列表,尽管即使考虑到它也不会改变太多答案。此外,对于您的userName和userId用例,这可能完全是一个争论点。
正如您所暗示的,简单的HashMap
是不够的-这意味着您需要遍历条目以查找具有特定键的条目,这将是O(n)操作
使用两个HashMap
(名称为id和id为名称)是一种很好的方法。尽管这意味着您每次添加/删除/修改用户都必须执行两次操作,而不是一次,但这不会影响数量级(因为您仍在执行恒定数量的恒定时间操作),您将保留O(1)插入时间。
实际上,这实际上是一种非常常见的方法,如果您可以将第三方库引入您的项目中,则可以使用此概念的相当可靠的实现,例如Apache Commons Collections的DualHashBidiMap。
答案 1 :(得分:4)
地图用于按键搜索,因此,除非您使用第二张地图,否则您不会通过值进行O(1)查找。
为您的用例服务的是Google Guava中的BiMap
BiMap<String, Integer> nameidmap = HashBiMap.create();
Integer id = nameidmap.get("name");
String name = nameidmap.inverse().get(12345);
在内部,番石榴还维护两个哈希表,但是它使保持两个地图同步非常繁重。您可以找到Bimap here的完整Javadoc。
答案 2 :(得分:2)
如果您只想使用单个哈希图,则可以
map.put(键,值),然后map.put(值,键)
假设值是唯一的并且也不等于任何键