【发布时间】:2017-01-25 07:07:01
【问题描述】:
我有一个遍历的数组列表。在每次迭代中,我调用 get() 来获取一个元素,如果该项目通过了某些条件,则使用 add() 将其添加到新的数组列表中
List<Item> items = new ArrayList<Item>();
List<Item> lessItems = new ArrayList<Item>();
for(int index = 0; index < items.size(); index++){
Item toCheck = items.get(i);
if(toCheck meets some condition){
lessItems.add(toCheck);
}
}
我不确定这里的时间复杂度是多少。我在所有项目上调用 get(),所以它是 O(n)。然后我还可能在所有项目上调用 add(),所以还有另一个 O(n)。这个不太确定。
【问题讨论】:
-
它是 O(n) + O(n),即 O(2n),您可以删除 2(因为它相对于输入是恒定的)并说它是 O(n)。
-
@ElliottFrisch 这不是真的。在java中插入arraylist的最后一个元素不是
O(n)。请看我的回答。 -
@ElliottFrisch 显然其他人不同意你的观点。足以对我的答案投反对票,这与您的答案相同。
-
@fgb,分歧在于缺乏清晰度和准确性。有一个循环使这个
O(n)。之后,您有一些(不是 2 个)恒定时间操作。他们不应该像@Elliott 在之前的 cmets 中那样说。说O(n) + O(n)是不正确和不准确的,因为第二种复杂性存在于第一种复杂性内部(IOW,它不是加法而是常数项的乘法);这是cn =O(n)`。 -
@fgb,如果您想提取获取和添加并匹配 OP 所做的事情,它们确实是等价的。但它仍然不完整。他们显然“对这个不太确定”,所以为什么不准确或至少不完整
O(n) + O(n)?还有其他时间。
标签: java arrays algorithm arraylist data-structures