【问题标题】:Time complexity difference in Linkedlist implementation (Iterative VS Recursive)?链表实现的时间复杂度差异(迭代VS递归)?
【发布时间】:2019-06-05 19:42:05
【问题描述】:

这两种获取链表中节点数的实现的时间复杂度是否会发生变化?

 private int getCountIterative() {

    Node start = head;
    int count = 0;
    while (start != null)
    {
        count++;
        start = start.next;
    }
    return count;
}


private int getCountRecursive(Node node) {
    if (node == null)
        return 0;
    return 1 + getCountRecursive(node.next);
}

【问题讨论】:

    标签: java singly-linked-list


    【解决方案1】:

    TL;DR:同样的复杂性

    要计算操作的复杂性(例如搜索或排序算法 - 或者您的示例,计数),您需要确定主导操作。

    对于搜索和排序,通常是比较。你的主导业务是什么?假设它是node.next,即查找下一个节点。

    然后,这两种方法都有 O(n) 操作 - 所以复杂度相同。

    请注意,这个时间复杂度是一种简化。有一些因素被忽略了,比如函数调用的开销。因此,它具有相同的复杂性,但这并不一定能告诉您哪个版本更快。

    【讨论】:

      【解决方案2】:

      不,时间复杂度不会改变。

      但是,递归解决方案的性能和整体运行时间通常会更差,因为 Java 不执行 Tail Call Optimization。

      【讨论】:

      • 我不确定这里是否可以进行尾调用优化 - 递归调用不是最后一个操作。不过,可以重写代码以使其成为可能。优化器能做到吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多