java - 用于在 Java 中反转 LinkedList 的 BIg-Oh

标签 java big-o

请告知这两种情况下的 Big-O 是什么。我知道基本情况将是常量 O(1),但我对如何计算其余部分和递归感到困惑。

案例#1

public ListNode reverse1(ListNode list) {
    if (list == null || list.next == null) {
        return list;
    }
    ListNode after = reverse(list.next);
    list.next.next = list;
    list.next = null;
    return after;
}

案例#2

public ListNode reverse2(ListNode list) {
    if (list == null || list.next == null) {
        return list;
    }
    ListNode after = reverse2(list.next);
    ListNode temp = after;
    while (temp.next != null) {
        temp = temp.next;
    }
    temp.next = list;
    list.next = null;
    return after;
}

最佳答案

在你的第一种情况下递归给出:

T(n) = T(n-1) + c 

其中 T(n) 是 n 个节点的总步骤,为了反转 n 个节点,你只需反转 n-1 T(n-1) 并通过执行花费 c 的常量操作添加第 n 个节点(常量值无关紧要)。

上面的递归关系很容易看出:

T(n) = T(n-1) + c = T(n-2) + 2c =...= nc = O(n)

在你的第二种情况递归给出:

T(n) = T(n-1) + n + c 

那是因为为了反转 n 个节点,您在 T(n-1) 中反转了 n-1 并遍历列表以便将节点放在花费 n 的结束和花费最多 c 的恒定操作(c 无关紧要)。

上面的递归关系很容易看出:

T(n) = T(n-1) + n +c = T(n-2) + n + (n-1) + 2c =...= n(n-1)/2 +nc = O(n^2)

关于java - 用于在 Java 中反转 LinkedList 的 BIg-Oh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47006460/

相关文章:

java - 通过 JSP 使用 Web 服务 JAX

java - 为什么我从 OkHttp 请求中收到 PROTOCOL ERROR?

algorithm - 当某物是 Big O 时,是否意味着它正是 Big O 的结果?

algorithm - 按最大元素对 k 个排序列表进行排序

java - 硬币算法的复杂性

java - Class.forName() - 还有其他方法使用它吗?

java - Android Studio MalformedJsonException

java - Rapidminer与Java的集成: Obtaining the output Example Set (Process Result)

algorithm - 复杂循环的大 O 表示法

java - 什么是时间复杂度 O(1) 次,Java 中的 O(n) 次