1. 程式人生 > 實用技巧 >演算法學習-倍增

演算法學習-倍增

倍增就是字面意思,成倍的增長,如果狀態空間很大,通常的線性遞推無法滿足要求時,那麼我們可以採用成倍增長的方式,只遞推狀態空間中在2的整數次冪位置上的值作為代表。而其他位置的值我們可以通過“任意整數可以表示成若干個2的次冪項的和”這一性質,使用之前求出的代表值拼成所需的值。所以使用倍增演算法也要求我們問題的狀態空間關於2的次冪具有可劃分行。

  倍增和二進位制劃分相結合,降低了求解問題的時間和空間複雜度。

1. ST演算法

  在RMQ(區間最值問題)問題中,著名的ST演算法就是倍增的產物。給定一個長度問N的數列A,ST演算法可以在O(NlogN)O(1)

O(Nlog⁡N)時間的預處理後,以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]);
}