Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有set()方法和O(1)Contains()的Java数据结构_Java_Collections_Big O - Fatal编程技术网

带有set()方法和O(1)Contains()的Java数据结构

带有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(

Java中是否存在一个有序的数据结构,可以替换特定索引处的项,并且还具有时间复杂度为O(1)的contains方法


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()
等。