如何求解遞推式 T(n) = T(n-1) + T(floor(n/2)) + 1?

完整的遞推式為T(n) = T(n-1) + T(lfloor n/2 
floor) + 1

初值為T(0) = 1, T(1) = 3, T(2) = 5, T(3) = 7,遞推式從n=4開始有效。

這個遞推式超出了Master theorem和Akra-Bazzi method能夠處理的範圍。

用z變換求解也遇到了困難(式中同時出現了mathcal{T}(z)mathcal{T}(z^2))。

在知乎上搜索也沒有發現本質相同的遞推式。

感覺跟下面這個函數有相似之處:

請問形狀如下圖的函數,且滿足f "(x) = f(2x)。如何得到這個函數的具體形式? - 數學

如果求完整表達式很困難,能求出Big-Theta notation也可以。


目測T(n)=e^{(frac{1}{2}+o(1))log^2 n},是quasi-polynomial。

***********以下是更新***********

T(n)-T(n-1)=T對於某個0leq xileq 1。鑒於我們只是在目測答案,所以捨棄這個xi。於是,就是要求某個T使得T

開始目測:代任何一個polynomial T(n)=n^c,發現右邊太大,說明T(n)是super-polynomial。代T(n)=e^{cn},發現左邊太大,說明T(n)是sub-exponential。於是,(不知道為什麼)設T(n)=e^{f(log n)},即e^{f(log n)}f。兩邊取對數,換元,再用之前的trick,得到f。於是,f(t)approx frac{1}{2} t^2

最後,將T(n)=e^{clog^2 n}代入原遞歸式驗算,發現c<frac{1}{2}時,右邊大,c>frac{1}{2}時,左邊大。就可以用歸納法證明T(n)=e^{(frac{1}{2}+o(1))log^2 n}了(?)


具體求解特別困難的樣子。漸進的話如下勉強可作(弊)。 (剛發現你的初始值居然不太一樣,不過應該不影響結果...)

首先生成前若干項(Mathematica):

{1, 3, 5, 9, 13, 19, 25, 35, 45, 59, 73, 93, 113, 139, 165, 201, 237, 283, 329, 389}

丟到OEIS里,得到這個序列:A102378 - OEIS。(設為a(n)

裡面寫了a(n) - a(n-1) = 	ext{A018819}(n+1), 所以跑到A018819看下描述(把n拆分成2的冪的和的方法數,設為p(n))。

然後隨便Google搜搜partitions into powers of two之類的,找到A000123 - OEIS (把2n拆分成2的冪的和的方法數,即p(2n))。

裡面Formula里,解析組合學的鼻祖之一的Philippe Flajolet(同時也是我最近看的書的作者之一,可惜已逝)提到漸進展開已在de Bruijn的論文里給出。

在同頁面查找de Bruijn,找到論文名《On Mahler"s partition problem》及其PDF http://www.dwc.knaw.nl/DL/publications/PU00018536.pdf

點開鏈接,得到A000123(把2n拆分成2的冪的和的方法數)的漸進表達式。忽略低階項和係數,p(2n)sim exp(log(n)^2)sim p(n)

回到一開始,因為p(n) le a(n) le np(n) sim exp(log(n)) cdot exp(log(n)^2) sim exp(log(n)^2) sim p(n)

所以夾逼得到T(n)=a(n)sim exp(log(n)^2)

省略了n多係數/低階項,也有若干的off by 1(懶),不過但願漸進階不差太多...感興趣的可以嚴格分析一下,把log的係數什麼的補上。


考慮x
ightarrow +infty時滿足T的函數T(x),有

T(x)=exp{(frac{{(ln{x})}^{2}}{2ln{2}}-frac{ln{x}ln{ln{x}}}{ln{2}}+(-frac{1}{2}+frac{1}{ln{2}}+frac{ln{ln{2}}}{ln{2}})ln{x}+frac{(ln{ln{x}})^{2}}{2ln{2}}+(-1+frac{ln{ln{2}}}{ln{2}})ln{ln{x}}+O(1))}

計算可能有誤。

原遞推式不太懂,不過個人猜想T[n]=kT(n)(1+o(1))

在大O符號下可以只考慮T(x)(需要證明)。

根據匿名用戶的思路,設T(x)=exp{(F(ln{x}))}

T

T(frac{x}{2})=exp{(F(ln{x}-ln{2}))}

l=ln{x}

T

T(frac{x}{2})=exp{(F(l-ln{2}))}

考慮到F(l)沒有初等表達式,設我們近似用的函數G(l)滿足G(l)+epsilon(l)=F(l)

則余項R=G(l)-l+ln{G

R主項與(-ln{2})epsilon相同,反過來可以得到epsilon(l)的主項同-frac{int {R}mathrm{d}l}{ln{2}}

這樣可以用如下方式來逐步逼近F(l)

G_0(l)=lG_0(l)=frac{l^{2}}{2ln{2}}

R_{i}(l)=mathrm{main}(G_{i}(l)-l+ln{G

epsilon_i(l)=-frac{int {R_{i}(l)}mathrm{d}l}{ln{2}}

G_{i+1}(l)=G_{i}(l)+epsilon_{i}(l)

將余項控制在O(1)似乎是可行的(需要證明)

更新:

似乎可以用待定係數法

G(l)=Al^{2}+Blln{l}+Cl+D(ln{l})^2+Eln{l}

可以控制R(l)的主項為O(frac{ln{l}}{l^{2}})

這樣就可以得出F(l)-G(l)=O(1)

不過各係數的計算可能還有些錯誤,希望能詳細求出……


推薦閱讀:

如何評價2015年的數模美賽?
焦李成寫的深度學習、優化與識別這本書怎麼樣?
面試有多年從業經歷但是基礎不好的程序員,是否需要詢問基礎演算法的問題?
做一個簡單的搜索引擎,需要哪些知識和技術?

TAG:演算法 | 數學 | 計算機科學 | 高等數學 | 複雜度 |