繁体   English   中英

递归函数的时间复杂度

[英]Time Complexity of a Recursion Function

假设我正在使用以下代码来反向打印链表:

public void reverse(){
    reverse(head);
}

private void reverse(Node h){
    if(h.next==null){
        System.out.print(h.data+" ");
        return;
    }

    reverse(h.next);
    System.out.print(h.data+" ");   
}

链表以相反的顺序打印出来,但是我不知道它的效率。 我如何确定此功能的时间复杂度? 有更有效的方法吗?

您可以使用递归树或只展开T(n)。两者本质上是相同的方法。 您正在做的事情是通过记下每次在堆栈中调用它时所做的事情来扩展递归函数。

对于前。 每次调用函数时,它都会执行一些固定时间的工作(打印数据),然后递归执行。 因此,对其进行扩展,您将得到:T(n)= d + T(n-1){因为完成了一次递归,所以少了一次递归} = d + d + T(n-2)它将继续执行直到它消失为止,所以您的函数将继续执行到列表的长度。因此复杂度:O(n)检查以下内容: 递归算法的时间复杂度

通常很难计算递归算法的时间复杂度。 但是,有很多可用资源。 我将从这个stackoverflow问题开始,一个递归算法的时间复杂度

就此函数的时间复杂度而言,它是O(n),因为您调用了n次反向操作(每个节点一次)。 没有任何更有效的方法可以反向甚至打印列表。 问题本身要求您至少查看列表中的每个元素,根据定义,这些元素是O(n)操作。

假设您的清单包含n个元素。 每次对reverse(Node)调用都会使列表的长度减少单个元素。 因此,效率为O(n),这显然是最佳的:您不能在不考虑所有元素的情况下反转列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM