【问题标题】:Implement a list with o(1) running time实现一个运行时间为 o(1) 的列表
【发布时间】:2017-09-29 10:33:42
【问题描述】:

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

【问题讨论】:

  • 您所说的“这超出了列出清单的目的”是什么意思?
  • 如果你使用了一个根据需要加倍大小的扩展列表,你可以实现分期 O(1) 获取、设置和添加,这意味着你最终需要扩展它的大小,但这并不经常发生。很确定这就是 Java 的 ArrayList 类的工作原理。
  • “我无法理解如何在 o(1) 处保持搜索或添加时间”此外,搜索时间不会是 O(1)。仅获取、设置和添加。
  • 我无法理解如何在 o(1) 处保持搜索或添加时间。谁说过搜索时间?
  • 只是想澄清一下:这里的add()是指add(E element)(添加到列表末尾,还是add(int index, E element)(添加到特定索引)?如果它包括后一种情况,那么我认为没有任何解决方案(还)。如果您只需要前一种情况,那么ArrayList 已经为您服务(在其他答案中解释)

标签: java algorithm time implementation


【解决方案1】:

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

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

【讨论】:

  • 除非列表是用哈希表索引的。
  • @selbie 那么它就不是一个列表了。
  • @shmosel 您可以扩展ArrayList 并覆盖indexOf 以由HashMap<E,Integer> 支持,除非在实现中使用哈希表会自动使其不是列表?
  • @4castle 这实际上是个好主意。我的观点是数组列表和哈希表是独立的数据结构。当然,他们可以共享一个屋顶来降低时间复杂度(以增加内存和写入成本),所以也许它是一个“java.util.List,搜索时间为 O(1)”,但我不会称之为“列表 [结构] 搜索时间为 O(1)”。
  • 但是当你的空间用完并且必须重新散列时怎么办?这需要 O(n) 次(n 是您拥有的元素数)
【解决方案2】:

只是发布我的评论作为答案......

如果您使用可根据需要扩展大小的扩展列表,则可以实现 amortized O(1) getting、setting 和 adding,即只是意味着您最终需要扩大其规模,但这并不经常发生。很确定这就是 Java 的 ArrayList 类的工作原理。

您可以在此处阅读有关它的更多信息。 https://stackoverflow.com/a/4450659/1572906

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

【讨论】:

  • 哈希表在摊销/平均情况下通常被认为是 O(1)。所以搜索可能是 O(1) ...
  • HashSet put() 和 get() 都是 O(1)。 TreeSet 是 O(log n)
  • add() in ArrayList 可能是 O(n),因为有一个 add(int index, E element)。只有当您只考虑在列表末尾添加时,它才是O(1)。我相信 OP 应该更清楚他的问题
  • 我的错,你是对的。我修好了它;不知道我在想什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多