【问题标题】:What is the time complexity of Search in ArrayList?ArrayList 中 Search 的时间复杂度是多少?
【发布时间】:2019-02-02 13:15:29
【问题描述】:

一个我无法回答的面试问题,也无法在网上找到任何相关答案。

我知道 arraylist 根据索引在恒定时间内检索数据。

假设在一个数组列表中,有 10000 个数据并且元素位于第 5000 个位置(我们没有给出位置),我们必须搜索一个特定的值(例如整数 3,它恰好在第 5000 个索引上) ,为了查找值,我们将不得不遍历arraylist来查找值,这需要线性时间对吗??

因为如果我们遍历arraylist来查找数据,它会花费线性时间而不是恒定时间。

简而言之,我想知道 contains 方法的内部工作原理,我必须在其中检查特定值并且我没有索引。它必须遍历数组以检查特定值,并且需要 O(n) 时间,对吧?

提前致谢。

【问题讨论】:

  • 基于索引的检索需要固定时间。搜索特定值是线性的(除非数组已排序,在这种情况下,您应用 bin.search 以 O(logn) 时间)。有没有可能你误解了这个问题?也许提供了一些额外的细节
  • @mangusta。面试官问我关于arraylist和linkedlist之间区别的问题,我告诉他linkedlist有利于插入和删除,因为它需要恒定的时间,而arraylist需要O(1)进行搜索。我告诉过arraylist 搜索适用于索引,因为它需要恒定的时间。然后他问假设元素在第 5000 个位置,你必须从索引 0 开始搜索,这也需要线性时间。怎么说它需要 O(1) ?

标签: arraylist contains


【解决方案1】:

我希望这是您想了解的关于在 ArrayList 中搜索的内容:

数组在内存中按顺序排列。这意味着,如果它是一个整数数组,每个使用 4 个字节,并且从内存地址 1000 开始,则下一个元素将位于 1004,下一个元素位于 1008,依此类推。因此,如果我想要数组中第 20 位的元素,get() 中的代码必须计算:

1000 + 20 * 4 = 1080 

获得元素的确切内存地址。好吧,RAM 存储器之所以得名随机存取存储器,是因为它们的构建方式使得它们具有硬件多路复用器的层次结构,允许它们在给定地址的情况下以恒定的时间访问任何存储的内存单元(字节?)。

因此,两个简单的算术运算和一个对 RAM 的访问被称为 O(1)。请参阅link 原始答案。

【讨论】:

  • 非常感谢。如果是 contains 方法,它会遍历 arraylist 以找到特定的值,并且需要线性时间对吗?
  • @neil 是的,contains() 的复杂度是 O(n)。见original answer
  • @neil 如果这是您想知道的,您应该将答案标记为正确。
  • 我们该怎么做?
猜你喜欢
  • 2018-11-24
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2016-08-21
  • 2017-03-19
  • 2013-05-21
相关资源
最近更新 更多