Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 时间复杂度和列表中的add()_Java_Performance_Algorithm_Time_Complexity Theory - Fatal编程技术网

Java 时间复杂度和列表中的add()

Java 时间复杂度和列表中的add(),java,performance,algorithm,time,complexity-theory,Java,Performance,Algorithm,Time,Complexity Theory,这里有一个算法。因为它只是一个for循环,所以我认为它是O(N),但有人告诉我它是O(N2)。有人告诉我这是因为list.add,但这不会改变N?那么,为什么时间复杂性会发生变化呢 public static void mystery3(List<String> list) { for (int i = 0; i < list.size() - 1; i += 2) { String first = list.remove(i);

这里有一个算法。因为它只是一个for循环,所以我认为它是O(N),但有人告诉我它是O(N2)。有人告诉我这是因为list.add,但这不会改变N?那么,为什么时间复杂性会发生变化呢

public static void mystery3(List<String> list) {
        for (int i = 0; i < list.size() - 1; i += 2) {
            String first = list.remove(i);
            list.add(i + 1, first);
        }
    }
publicstaticvoidmystery3(列表){
对于(int i=0;i
如果您使用的是数组(Arraylist),
删除(i)
取O(n),而
添加(…)
取O(n)。这是因为在索引i处查找元素需要O(1),但调整大小需要O(n)

如果使用链表,
remove(i)
接受O(n)`add(…)接受O(n)。这是因为在索引i处查找元素需要O(n),删除元素需要O(1)


因为您调用了n/2次方法,所以它的整个运行时间是O(n^2)。

这取决于List接口的实际实现。这是一个简单的循环,但是您认为List.remove(i)在做什么?它的时间复杂度是什么?它删除了一个只有O(1)的索引?当然,除非它是一个物体。。。哪个字符串是,这就是O(N)。不,它不是这样做的。set()就是这样做的。remove()删除元素并更改列表的大小。如果它由数组支持,则索引后的所有元素都必须移向数组的开头。如果它是一个链表,它必须移动到第i个元素,并删除节点。读取javadoc.add(o)是o(1),而add(x,o)是o(n),因为它需要在列表中向下移动所有后续对象。remove(o)是o(n),因为它需要将列表中所有后续对象上移。当两个操作为o(n)且未嵌套时,结果复杂性仍然是o(n)而不是o(n^2)。(或者在您的例子中是O(N/2))@Farhadfaghi,它们是嵌套的,因为是O(N)次删除和添加O(N),或者更好的O(N/2*1)+O(N/2*N),结果是O(N/2)+O(N^2/2)。因为我们考虑最高运行时,它是O(n ^ 2/2),最终,在移除常量值后会产生二次运行时间,即O(n ^ 2)。@ HANEES:谢谢你的回复。我明白了。这是我的错误