證明:最壞情況下就是對已經排好序的序列操作,假設是從小到大,那麼last就會從最後一直比到first(哨兵位置)(共比較n-1次),並且將序列分為1和n-1,之後n-1以類似方式被遞迴劃分。
假設演算法每次都進行了這種不對稱劃分,劃分的時間代價為θ(n)[//n是元素個數],因為對乙個大小為0的陣列遞迴呼叫後t(0)=θ(1)[//相當於只呼叫一次就會返回,不會進行更深層次的遞迴呼叫],演算法的執行時間可以遞迴表示為:
t(n)=t(n-1)+t(0)+θ(n)=t(n-1)+θ(n)
書上說是用代換法。代換法兩步:1)假設解的形式 2)用數學歸納找出使解真正有效的常數。例如:
執行時間是θ(n^2).最壞情況下並不比直接插入好。
最好情況是在平均劃分的情況下:
t(n)≤2t(n/2)+θ(n).
之所以是≤,是因為乙個被劃分為n/2取地板,另乙個子問題大小為n/2取天棚減1.
方法證明:
主定理:
//主變數定理證明我沒看。
在t(n)≤2t(n/2)+θ(n)中,f(n)=θ(n)=cn. a=2,b=2,所以使用第2條得t(n)=o(nlgn).
還討論了,劃分是9:1劃分,得到的結果是執行時間也是θ(nlgn).主要原因是任意一種常數比例進行的劃分都會產生深度為θ(lgn)得遞迴樹。
在平均情況下,好的劃分和壞的劃分是平均出現在劃分樹上的,當好、差劃分交替在各層時,快排的執行時間就如全是好的劃分一樣,為θ(nlgn).
附知乎大佬回答:
//這個平均情況的公式不太理解
//明天再來寫,根據規模使用不同的排序演算法+快排變形。
快速排序的時間複雜度與空間複雜度
我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...
分塊的複雜度證明
我們都知道,分塊的時間複雜度是 o n sqrt n o n n 不過不知大家有沒有想過這個複雜度是如何得出的?如果你只關心分塊演算法的實現及其應用,請忽略這篇文章 如果你早就知道了證明方法,請忽略這篇文章 如果你是神犇,請務必忽略以下內容 設定在給出證明之前,先給出一些符號宣告 設原序列的長度為 ...
Manacher時間複雜度證明
今天,我們來證明一下manacher的時間複雜度。先貼上manacher演算法的模板 s 0 s m for b 1 ss b 0 b s m for int i 1 i m i 我們考慮產生複雜度的地方,分別是最外層對整個字串的遍歷和每次對回文串擴充套件的while。顯然,最外層的for迴圈是o ...