链表实现的时间复杂度差异(迭代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递归)?的主要内容,如果未能解决你的问题,请参考以下文章