【问题标题】:Running time between Linked List and ArrayList? Code analysisLinked List 和 ArrayList 之间的运行时间?代码分析
【发布时间】:2016-04-14 01:35:07
【问题描述】:

下周我有一个期中考试,其中一些与代码分析/求和简化有关。我很迷茫,正在努力理解我的教授在练习工作表上给我们的这个问题。

下面是伪代码:

 List <Integer> method( List <Integer> ints) { 
     for ( int i = 0; i < ints.size() / 2; i ++) { 
         swap(i, n − i − 1);
  }

问题是:假设 List 是一个 ArrayList,将此方法的最坏情况运行时间表示为总和? 其中我得到了 O(log n),因为列表的大小每次都被分成两半。

但接下来的问题是:假设 List 是 LinkedList,将这个方法的最坏情况运行时间表示为总和? 现在我很困惑,我知道 ArrayLists 和 LinkedLists 具有不同的时间复杂度,但答案不会是相同的 O(log n) 吗?

另外,我如何将其表达为每个问题的总和?这不是家庭作业,但我正在尽力理解这个主题。

【问题讨论】:

  • 在 ArrayList 场景中是 nlog(n)。在 LinkedList 场景中,它的 n^2.log(n)
  • @ImeshaSudasingha 这是因为列表的运行时间是 O(n),而链表的运行时间是 O(n^2)?这很有意义。
  • @ImeshaSudasingha 为什么会是 nlogn?如果ints 是一个 ArrayList,那么它就是 O(n)。如果它是一个 LinkedList,它将是 O(n^2),因为您必须为每个元素再次遍历列表。不应该有任何日志,因为长度只减半一次 - 不是每次迭代。
  • 对不起,应该是O(n)和O(n^2)。
  • @LukeLaFountaine 我很困惑,既然它在循环中,为什​​么每次迭代都不会减半?

标签: java arraylist time linked-list time-complexity


【解决方案1】:

如果ints 是一个ArrayList,它可以在恒定时间内访问任何元素。所以它会遍历元素的前半部分并将它们与后半部分的相应元素交换。这仍然被认为是O(n),因为迭代的总数将是1/2 * (n),并且您删除了大 O 表示法的常数。

如果ints 是一个LinkedList,你没有固定时间访问任何元素——你必须遍历整个列表才能找到每个元素。因此,对于列表前半部分中的每个元素,您将再次迭代以从后半部分中找到相应的元素。这会导致O(n^2) 的最坏情况运行时间。

【讨论】:

  • 谢谢!这回答了我的问题,如果我以总和的形式提出这个问题,我会怎么做?
  • 第一个:Σ i from i=0 -&gt; n
  • 第二个:Σ i*n from i=0 -&gt; n
  • 抱歉,不确定如何在 markdown 中做正确的求和符号
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2015-04-13
相关资源
最近更新 更多