下周我有一个中期,其中一些与代码分析/总和简化有关。我很迷茫,正在努力理解我的教授在练习工作单上给我们的这个问题。
这是伪代码:
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)?
另外,我如何将此表达为每个问题的总和?这不是作业,但我正在尽力理解这个主题。
答案 0 :(得分:1)
如果ints
是一个ArrayList,它可以在恒定时间内访问任何元素。因此,它将通过元素的前半部分并使用下半部分中的相应元素进行交换。这仍然被认为是O(n)
,因为迭代的总数将是1/2 * (n)
,并且您删除了大O表示法的常量。
如果ints
是LinkedList,则您没有时间访问任何元素 - 您必须遍历整个列表才能访问每个元素。因此,对于列表前半部分中的每个元素,您将再次迭代以查找后半部分中的相应元素。这导致O(n^2)
的最坏情况运行时。