簡體   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