带有set()方法和O(1)Contains()的Java数据结构
Java中是否存在一个有序的数据结构,可以替换特定索引处的项,并且还具有时间复杂度为O(1)的contains方法带有set()方法和O(1)Contains()的Java数据结构,java,collections,big-o,Java,Collections,Big O,Java中是否存在一个有序的数据结构,可以替换特定索引处的项,并且还具有时间复杂度为O(1)的contains方法 LinkedHashSet几乎就是我要寻找的,但您不能使用它们在索引中设置/替换项 不在标准Java类中。您可以相当容易地创建一个类,该类可以组成一个HashSet和一个ArrayList 您可以使用将项目存储在ArrayList中,并使用HashMap将元素类型映射到列表中等价类中的元素数量,从而允许使用列表访问元素,并允许您测试是否使用 Integer i = map.get(
LinkedHashSet几乎就是我要寻找的,但您不能使用它们在索引中设置/替换项 不在标准Java类中。您可以相当容易地创建一个类,该类可以组成一个
HashSet
和一个ArrayList
您可以使用将项目存储在ArrayList
中,并使用HashMap
将元素类型映射到列表中等价类中的元素数量,从而允许使用列表访问元素,并允许您测试是否使用
Integer i = map.get(object);
boolean contained = ( i != null ) && ( i > 0 );
更新地图以添加元素:
map.merge(object, 1, Integer::sum);
map.computeIfPresent(object, (k, v) -> v > 1 ? v - 1 : null);
删除元素:
map.merge(object, 1, Integer::sum);
map.computeIfPresent(object, (k, v) -> v > 1 ? v - 1 : null);
如果列表中的某个项目被替换,则可以按如下方式处理:
map.merge(newValue, 1, Integer::sum);
map.computeIfPresent(oldValue, (k, v) -> v > 1 ? v - 1 : null);
以两倍的内存成本。对。但在这方面,它并不比LinkedHashSet差。@shmosel的内存成本不是LinkedHashSet的两倍。额外的成本将在元素的大小上摊销。如果它们是整数,那么是的,这将相对昂贵。如果它们每个都是1000字节,那么额外的成本可以忽略不计。@JimGarrison当然。我指的是集合的大小,而不是它的内容。对于作业,我也必须处理包含内容之类的内容,但它们的成本太高了。因此,我通过创建一个小界面来解决这个问题,这个界面有两种方法。“设置是否在解决方案中”、“我是否在解决方案中”。在类本身中,我必须使用一个局部变量。不是最优雅的,但它很管用。此外,排序列表中的内容可以归结为复杂性日志(n),因为您可以对其进行二进制搜索。如果你认为你可以使用2-3棵树,甚至更低。排序,检查元素的低成本,但没有索引替换:/O是否也希望能够在O(1)中删除?@vaxquis这会很好,但并不重要。您希望能够对其使用通用排序算法,还是严格要求列表
接口?如果不是,那么为什么不简单地为双向HashMap
+HashMap
使用包装器呢?(类似或类似,手工制作);尽管如此,如果您这样做,您仍然可以将它们改装为bidi地图。进一步阅读:我的意思是,您可以为bidi-intobject基于哈希的映射创建一个包装器,该映射实现List
作为其接口,透明地充当List
。这在这里应该能很好地发挥作用。基本上,您希望获得只有哈希表才能提供的所有优点—通过使用bidi映射,您可以获得O(1)迭代和准排序,并将其存储为映射索引。请注意,有了适当的列表
实现,您基本上可以免费获得sort()
,因为您已经有了get()
、set()
等。