Java 实现一个运行时间为o(1)的列表

Java 实现一个运行时间为o(1)的列表,java,algorithm,time,implementation,Java,Algorithm,Time,Implementation,我能列出所有运行时间快的产品吗?有可能有这种类型的列表吗?如果搜索需要通过节点来搜索其他节点,我无法理解如何保持搜索或添加时间不变,更不用说添加了。起初你只说get()、add()和set(),但后来你也说了search()。在ArrayList和类似的实现中,前三个都有O(1)个平均运行时间。在通常被视为列表的任何内容中,都不能有O(1)个搜索时间 编辑:有些人正确地指出,如果列表实现还将元素索引存储在hashmap中,则可以获得O(1)个查找时间。严格地说,只要它实现了一个列表接口,它就是一

我能列出所有运行时间快的产品吗?有可能有这种类型的列表吗?如果搜索需要通过节点来搜索其他节点,我无法理解如何保持搜索或添加时间不变,更不用说添加了。

起初你只说get()、add()和set(),但后来你也说了search()。在ArrayList和类似的实现中,前三个都有O(1)个平均运行时间。在通常被视为列表的任何内容中,都不能有O(1)个搜索时间


编辑:有些人正确地指出,如果列表实现还将元素索引存储在hashmap中,则可以获得O(1)个查找时间。严格地说,只要它实现了一个列表接口,它就是一个列表。我应该说,你不能只凭一个列表就这么做。

只是把我的评论作为一个答案


如果您使用了一个扩展列表,它可以根据需要扩展大小,您可以实现摊销O(1)
get
ting、
set
ting和
add
ing,这只意味着您最终需要扩展它的大小,但这种情况并不经常发生。非常确定这就是Java的ArrayList类的工作方式

你可以在这里了解更多


您提到了搜索,但使用这种方法,O(1)似乎不太可行。您可以使用数组旁边的哈希表实现O(1)。

您所说的“这超出了创建列表的目的”是什么意思?如果您使用的扩展列表的大小是您需要的两倍,则可以实现摊销O(1)获取、设置和添加,这只意味着您最终需要扩展其大小,但这种情况并不经常发生。Java的ArrayList类就是这样工作的。“我不知道如何将搜索或添加时间保持在o(1)”此外,搜索时间也不会是o(1)。只获取、设置和添加。我不知道如何在o(1)处保持搜索或添加时间。谁说了关于搜索时间的事?我只想澄清一下:
add()
这里的意思只是
add(E元素)
(添加到列表的末尾,或者
add(int-index,E元素)
(添加到特定的索引)?如果它包括后一种情况,那么我认为没有任何解决方案(现在)。如果您只需要前一个案例,则
ArrayList
已经满足您的目的(在其他答案中解释)除非列表是用哈希表索引的。@selbie那么它就不是列表了。@shmosel您可以扩展
ArrayList
并覆盖
indexOf
,以
HashMap
作为后盾,除非在实现中使用哈希表会自动使它不是列表?@4castle这实际上是个好主意。我的观点是rray列表和哈希表是独立的数据结构。当然,它们可以共享一个屋顶以降低时间复杂性(增加内存和写入成本),所以它可能是一个“
java.util.list
,具有O(1)搜索时间”,但我不会称之为“具有O(1)搜索时间的列表[结构”。但是,当您的空间用完并且必须重新刷新时,该怎么办呢?这需要O(n)倍的时间(n是您拥有的元素数)。在摊销/平均情况下,哈希表通常被认为是O(1)。因此搜索可能是O(1)…HashSet
put()
get()
都是O(1)。TreeSet是O(logn)
add()<代码> > ARAYLIST/<代码>可能是<代码> O(n)< /代码>,因为有一个<代码>添加(int index,e元素)。它是<代码> O(1)< /C>只有当你只考虑在列表末尾添加时。我相信OP应该在他的问题上更清楚,你是对的。我把它修好了。IDK我在想什么?