演算法學習-倍增
阿新 • • 發佈:2020-09-08
倍增就是字面意思,成倍的增長,如果狀態空間很大,通常的線性遞推無法滿足要求時,那麼我們可以採用成倍增長的方式,只遞推狀態空間中在2的整數次冪位置上的值作為代表。而其他位置的值我們可以通過“任意整數可以表示成若干個2的次冪項的和”這一性質,使用之前求出的代表值拼成所需的值。所以使用倍增演算法也要求我們問題的狀態空間關於2的次冪具有可劃分行。
倍增和二進位制劃分相結合,降低了求解問題的時間和空間複雜度。
1. ST演算法
在RMQ(區間最值問題)問題中,著名的ST演算法就是倍增的產物。給定一個長度問N的數列A,ST演算法可以在O(NlogN)時間的預處理後,以O(1) O(NlogN)時間的預處理後,以O(1)的時間複雜度線上回答”數列A中下標在l~r之間的數的最大值是多少“這樣的區間最值問題。
void ST_process(){ for(int i = 0; i <= n; ++i) f[i][0] = a[i]; for(int i = 0; i <= n; ++i) for(int j = 1; i + 1 << j <= n; ++j) f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]); } int ST_query(int l, int r){ int t = log(r - l + 1) / log(2); return max(f[l][t], f[r - (1 << t) + 1][t]); }