今天,我們來證明一下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(n)的,那麼我們只需要證明while的總迴圈次數也是o(n)級別的即可。
很容易發現,每次進入while,回文串的最大覆蓋範圍都會加1.(為什麼呢?)
1、如果以i位置的為回文中心的回文串的基礎長度沒有超出當前回文串的最大覆蓋範圍,那麼顯然不會進入while中(由於對稱性,該回文串的長度已經最大了)。
2、如果以i位置的為回文中心的回文串的基礎長度超出了當前回文串的最大覆蓋範圍,那麼顯然每進入一次while,回文串的最大覆蓋範圍都會加1.
那麼,當最大覆蓋範圍包含了整個字串之後,while迴圈就不會在進入了。所以while迴圈的總次數為o(n)。
綜上所述,manacher演算法的時間複雜度為o(n)。
建堆O n 時間複雜度證明
建堆複雜度先考慮滿二叉樹,計算完全二叉樹建堆複雜度基本相同。對滿二叉樹而言,第i層 根為第0層 有2 i個節點。由於建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過 n i 次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間複雜度計算如下 t n 2 0 n ...
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...