分塊的複雜度證明

2021-09-13 13:17:06 字數 1150 閱讀 6853

我們都知道,

分塊的時間複雜度是 o(n\sqrt n)o(n

n​ ) 。

不過不知大家有沒有想過這個複雜度是如何得出的?

如果你只關心分塊演算法的實現及其應用,請忽略這篇文章

如果你早就知道了證明方法,請忽略這篇文章

如果你是神犇,請務必忽略以下內容

設定在給出證明之前,先給出一些符號宣告 :

設原序列的長度為 nn ,被分成大小為 ss 的塊,

那麼可以知道,塊的總數量為 \dfracsn

​ 。對於整塊地操作的塊,最多有 \dfracsn

​ 次修改。

對於零散的塊,最多會出現 2s2s 次訪問。

總時間複雜度為 o(2s+\dfrac)o(2s+sn

​ ) 。

我們發現

\large 2s+\dfrac \ge 2 \sqrt2s+sn

​ ≥22n​

為什麼呢?其實只需要將不等式兩邊同時平方,可以得到:

\large (2s + \dfrac)^2 = (2s)^2+2s\dfrac + \left( \dfrac \right) ^2 = 4s^2 + 2n + \dfrac(2s+sn

​ )2

=(2s)

2+2ssn

​ +(sn

​ )2

=4s2

+2n+s2

n2\large ( 2 \sqrt)^2 = 8n(2

2n​ )

2=8n

明顯, \large 4s^2 + 2n + \dfrac \ge 8n4s

2+2n+s2

n2​ ≥8n

\text這裡給出均值不等式的證明:

\text \dfrac \ge \sqrt由均值不等式可知:

2a+b

​ ≥ab

​\text \ge \text(具體見:算術平均值 ≥ 幾何平均值)

\text a = 2s, b = \dfrac \text \dfrac} \ge \sqrt}因此,將a=2s,b=sn

​ 代入,得

22s+sn

​ ​ ≥2ss

n​ ​\text 2s + \dfrac \ge 2\sqrt即:2s+sn

​ ≥22n​

\text證畢.

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 ...

建堆O n 時間複雜度證明

建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。對滿二叉樹而言,第i層 根為第0層 有2 i個節點。由於建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過 n i 次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間複雜度計算如下 t n 2 0 n ...

快速排序複雜度證明 及優化

證明 最壞情況下就是對已經排好序的序列操作,假設是從小到大,那麼last就會從最後一直比到first 哨兵位置 共比較n 1次 並且將序列分為1和n 1,之後n 1以類似方式被遞迴劃分。假設演算法每次都進行了這種不對稱劃分,劃分的時間代價為 n n是元素個數 因為對乙個大小為0的陣列遞迴呼叫後t 0...