好,數學(在某種程度上)我得到這樣的:
T(n) = 2T(n/2) + c
T(1) = 1
歸納公式:
T(n) = 2^k * T(n/2^k) + (2^k - 1) * c
T(1) = 1
n/2^k == 1
時k == logN
這樣:
T(n) = 2^logN * T(1) + (2^logN - 1) * c
因爲T(1) = 1
並應用對數性質
T(n) = n * 1 + (n-1) * c
T(n) = n + n * c
T(n) = n * (1+c)
T(n) = O(n)
一個線索,這不是O(n*logn)
是你不必把兩個子問題結合起來。與mergesort
不同,您必須將兩個子數組組合在一起,此算法不必對遞歸結果做任何處理,因此其時間可表示爲常量c
。
更新:背後
該算法直覺應該是爲O(n),因爲您訪問的每個元素的數組中只有一次。這似乎並不重要,因爲遞歸永遠不會。
例如,您將問題分爲兩個子問題的一半大小,然後每個子問題也會被分成一半大小,並且會一直繼續下去,直到每個子問題的大小爲1. 完成後,您將擁有大小爲1的子問題,即n*O(1) = O(n)
。
從第一個問題開始到第一個問題的大小爲1的對數爲對數,因爲在每一步中你都細分爲兩個。但是在每一步中,您對結果都不做任何處理,因此這不會增加解決方案的時間複雜性。
希望這有助於
你知道如何'MergeSort'工作,和'O(N * LOGN)'複雜的證明嗎? –