java - 复杂度等级

标签 java time-complexity

这个问题的大 O 表示法是什么?为什么?我认为它是 O(N),因为我们这里有一个循环,但我不确定。

public static void mystery(List<String> list){

    for(int i = 0; i< list.size()-1; i+=2){

        String first = list.remove(i);

        list.add(i + 1, first);

    }

}

最佳答案

时间复杂度为O(n^2)。

循环将执行 floor(n/2) 次。 List.add(int i) 和 list.remove(int i) 的平均时间都是 O(n)(请参阅下面关于原因的注释)。这导致 O(n*n/2) 即 O(n^2)。

关于内置 List 实现的一些注意事项

在 ArrayList 上调用 List.add(int i, element) 或 List.remove(int i) 时,必须移动列表中的元素以插入或删除元素(当不在列表末尾时)平均所需的轮类次数为 n。因此,添加和删除操作都是 O(n)。

List.add(int i, element) 和 List.remove(int i) 在 LinkedList 上调用时也是 O(n)。这是因为需要遍历给定索引以删除/添加元素。

当我们知道对给定列表的添加/删除是顺序的时,我们可以做得更好。 使用 LinkedList 的 ListIterator 可用于将时间复杂度降低到 O(n)。在 LinkedLists ListIterator 上调用时,添加和删除方法的复杂度为 O(1),因为无需遍历给定索引。

Sample implementation of the askers method using ListIterator

public static void mystery(List<String> list){
    ListIterator<String> iterator = list.listIterator();
    int i = 0;
    while (i < list.size()-1) {
        String first = iterator.next();
        // Remove first
        iterator.remove();
        // Skip an element
        iterator.next();
        // insert at i+1
        iterator.add(first);
        i+=2;
    }
}

关于java - 复杂度等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14785150/

相关文章:

java - 捕获多个异常的处理程序?

java - 为什么 Netty 客户端连接 future.operationComplete 在调用者线程中被调用?

java - Struts 1 ActionForm 中的 ArrayList 未填充

java - 如何使用java从任务管理器中隐藏正在运行的进程?

algorithm - 递归二叉树遍历的运行时复杂度

python - 2个函数的时空复杂度

java - 将文本文件中的一行整数(带空格)读取到数组中? ( java )

java - 为什么我的java程序变得越来越慢?

javascript - 我的算法可以被认为是 O(n) 吗? "Finding the longest substring with unique characters"

algorithm - 分析具有递归 T(n) = T(n - 1) + T(n - 2) + c 的算法?