您的第一個遞歸關係通常用於描述運算時間爲分而治之算法。 a
此處顯示您將數據劃分爲多少個零件,1/b
顯示每個零件中使用的原始數據,f(n)
顯示您在每個「等級」上需要多少時間。例如,在QuickSort算法中,您將數據(數組或列表)分成兩部分,每部分只是原始數據的一半(1/2),並且在每個劃分的「級別」上,您都需要遍歷所有的元素1次。所以遞推關係是
T(n) = 2T(n/2) + n
(計算結果爲O(N * LG電子(n))的) 並在每一個「級別,你將數據分成兩個部分,但只取其中1二進制搜索,和時間「是不變的,所以關係是:
T(n) = T(n/2) + 1
但是,你的C函數並不遵循分而治之的策略。相反,它演示了數學歸納。您可以定義開始條件:如果l
等於NULL
,則長度爲0,如果它l->next
等於NULL
(您還定義了列表中1個元素的條件)。然後定義一種歸納步驟 - 如果知道第(n-1)個元素的函數值,則定義如何計算第n個元素的函數。因此,知道第一個元素的函數的值,可以應用此規則並獲得第二個元素的值,然後獲得第三個元素的值等等。
所以你可以看到歸納法是由自然界的遞推算法。這裏我們有2次考慮。首先是在起點(或終點 - 它取決於您查看列表的順序)計算值的時間。在你的函數中你只是返回這個值,所以它是不變的(C1
)。其次是做出1步的時間。在你的功能也是不變的(C2
)。直覺上,你應該可以看到這個算法的執行時間爲:
T(n) = C1, when n = 1
T(n) = T(n - 1) + C2, when n > 1
因此,除非n = 1
,你定義的時間,通過時間來執行它n - 1
元素n
元素上執行算法。在比戈符號任何常數定義爲1
和1個元件的情況下,不考慮,所以最終遞推關係是:
T(n) = T(n - 1) + 1
(其計算爲T(n) = T(n - 1) + 1 = T(n - 2) + 2 = ... = 1 + n
,或O(n)
)
進一步閱讀:
零件_的數量是'a','b'與零件_的長度成反比。 – ffriend 2012-03-05 01:10:14