关于大(O)表演的问题

时间:2011-03-05 03:13:08

标签: language-agnostic complexity-theory big-o

所以我的数据结构类覆盖了时间复杂度,我只是对arraylist和treemap的性能有一个快速的问题。

ArrayList的get方法是O(1),TreeMap的get方法是o(log n)

现在,如果我做了一个遍历整个列表或树的循环,例如

for (int i = 0; i < blahblah.size(); i++)
{

blah blah

}

对于arraylist,这个循环性能是o(1)还是o(n)?我意识到当你检索1个项目时,性能是O(1),但是这个循环遍历整个列表,所以不是1 * n项目会使它成为n吗?

树图是一样的,因为你要遍历整个树,所以它是o(log n)或n log n。

4 个答案:

答案 0 :(得分:1)

由于您需要数据结构的所有n个元素,因此结果不仅取决于给定的数据结构,还取决于您要检索的元素数量。

所以是的,结果将是O(n)或O(n log n),但是根据数据结构,你可以做得更好。考虑一个链表 - 而不是得到O(n * n)你可以用O(n)做得很好。

然而,除了大O之外,还有更多的表现 - 实际上常数很重要。一个例子是基数类型的32位数字。用于排序的O(n)听起来很棒,但对于大多数合理的输入大小,快速排序肯定会更快。

答案 1 :(得分:1)

“ArrayList的get方法是O(1),TreeMap的get方法是o(log n)”

ArrayList.get()是O(1)的原因是因为按索引查找只是从原点的偏移量。如果数组有5或5M元素,那么它的工作量是相同的。

TreeMap.get()是O(log n),因为它可能必须向下遍历二叉树的多个元素。

答案 2 :(得分:0)

是的,那将是O(n)。 O值几乎总是最坏的情况。

答案 3 :(得分:-1)

通过所有元素将O(n),因为您必须至少访问一次。

树形图也应该是O(n),原因与您是否按顺序,按顺序或预订顺序访问节点有关。