链表实现的时间复杂度差异(迭代VS递归)?

Posted

技术标签:

【中文标题】链表实现的时间复杂度差异(迭代VS递归)?【英文标题】:Time complexity difference in Linkedlist implementation (Iterative VS Recursive)? 【发布时间】: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);

【问题讨论】:

【参考方案1】:

TL;DR:同样的复杂性

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

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

我不确定这里是否可以进行尾调用优化 - 递归调用不是最后一个操作。不过,可以重写代码以使其成为可能。优化器能做到吗?

以上是关于链表实现的时间复杂度差异(迭代VS递归)?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode114 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)

移除链表元素(无傀儡节点,递归+迭代)

移除链表元素(无傀儡节点,递归+迭代)

递归和迭代的差异

递归和迭代的差异

复杂链表的复制(递归的两种实现方式)