計數迴圈迭代
大多數簡單演算法的執行時間,歸結於一個問題:每個迴圈本體跑幾次?計數迴圈迭代是分析的家常本事。訣竅是把內部工作發生的總次數,表示成輸入規模 n 的函數,再乘上那份工作的成本。
從簡單情形開始。「for i 從 1 到 n」的本體恰跑 n 次,所以若本體是 O(1),迴圈是 Theta(n)。每趟把計數器對半的迴圈——「while n > 1: n = n / 2」——大約跑 log2(n) 次,因為你只能把 n 對半到 1 約 log2(n) 次;這給出 Theta(log n),是二分搜尋及類似演算法的標誌。有趣的情形是界會動:在「for i 從 1 到 n: for j 從 1 到 i」中,第 i 趟外層時內部本體跑 i 次,所以總和是 1 + 2 + ... + n。這裡你不能只說「n 次的 n 工作」;你必須把這個等差級數加總,得到 n(n+1)/2 = Theta(n^2)。認出這種三角形和,是最常見的微妙之處。
所以方法是:把次數寫成對迴圈變數的求和,把這個和算成封閉形式(幾個標準公式就夠了——從 1 到 n 的和是 n(n+1)/2、對半序列的和約為 log n、等比級數的和由其最大項主導),這個封閉形式就是你的迭代次數。一個常見錯誤是瞥一眼兩個巢狀迴圈就反射性地寫 n^2,卻沒檢查內層的界是否真的依賴外層索引或資料;有時遠少於此,有時迴圈變數每步跳超過一個。
迴圈「for i = 1 到 n: i = i 乘 2」(i 每趟加倍)。i 的值為 1, 2, 4, 8, ... 直到 n,在 i 超過 n 之前約有 log2(n) 個值。所以這個迴圈跑 Theta(log n) 次,而非 n 次——加倍的步進使它變成對數,這是常見的混淆點。
計數器每趟如何變化(加 1?對半?加倍?)決定了迭代次數。
若迴圈變數是相乘或相除(而非遞增),通常給出對數次數。在假設 n^2 之前,務必檢查內層的界是否依賴外層索引。