Algorithm 复杂性与大O表示法

Algorithm 复杂性与大O表示法,algorithm,complexity-theory,big-o,Algorithm,Complexity Theory,Big O,假设项(一个ArrayList)有足够的未使用空间,它永远不需要重新调整大小,那么以下两种算法的最坏时间复杂度是多少?我最初的猜测是A运行得较慢,因为它必须将每个元素移到索引[0]处添加新元素。我认为B在最坏的情况下是O(N^2),但我不确定 A for(int i=0;i

假设项(一个
ArrayList
)有足够的未使用空间,它永远不需要重新调整大小,那么以下两种算法的最坏时间复杂度是多少?我最初的猜测是A运行得较慢,因为它必须将每个元素移到索引
[0]
处添加新元素。我认为B在最坏的情况下是O(N^2),但我不确定

A

for(int i=0;i
和B

for (int i = 0; i < N; i++)
    items.add(new Integer(i));
for(int i=0;i
在A中,每次插入都必须将数组列表内部数组中的所有项向右移动。这将是O(n^2)以完成操作。在第二种情况下,不需要换档,因此为O(n)。在一种情况下,你正在做大量不必要和昂贵的工作


我假设,正如您所规定的那样,内部数组没有调整大小。

如果您的问题是关于java的,那么第一个版本会更慢,并且具有复杂性
O(N^2)
,这正是您提到的原因,而B具有复杂性
O(N)

实现A可能是,通过假设
数组足够大,实现如下:

for (int i = 0; i < n; i++) {
    for (int j = items.size; j > 0; j++) {
        items[j] = items[j-1]; 
    }
    items[0] = i;
}
在这种情况下执行的操作数为


这具有复杂性O(n)

请更具体一点:这是什么语言?ArrayList实现在该语言中是标准化的吗?如果没有,没有人会给你一般的答案。如果是-阅读标准。它是用java编写的,并且是标准化的。我下面的评论假设是java,因为使用了术语ArrayList,并且调用了add方法。我想这正是我想要的。谢谢你的帮助!不知道为什么我的MathJax渲染不正确!
for (int i = 0; i < n; i++) {
    for (int j = items.size; j > 0; j++) {
        items[j] = items[j-1]; 
    }
    items[0] = i;
}
for (int i = 0; i < n; i++) {
    items[items.size] = i;
    items.size++;
}