RMQアルゴリズムは、STテーブルの実装を使用しています

RMQ


RMQ(範囲最小クエリ)は、必要最小限の間隔をいいます。一般的な方法を探していると、最小間隔の暴力です。

列の数の:
\ [A_1、A_2〜、〜A_3、〜\ cdots、A_N〜\]
所定の間隔のための\([L、R&LT〜]〜≤R≤N-1≦Lの\)、\ ( \分\ {A_l、A_ { L + 1}、cdots、A_R \ \} \) 計算はRMQ問題です。

この溶液である(\テキスト{スパース、表\ } \) 溶液と呼ばれる\(ST \)表。

  • 前処理:前処理がデータに対して実行される\(NログN \ \)複雑さの処理時間の

    オーダー\(D(i、j)は \) の\(a_iを、A_ {I + 1}、\ cdots、A_ {I + 2 ^ J - 1} \) 、すなわち、最小値である\(D(I、J )\)の間隔の長さ\(2 ^ J \)乗算が考え使用されます、。

    - \(D(I、J 1)\) の\(a_iを、A_ {1 + - \ 1}、\ cdots、A_ {1} -1 + iが2 ^ {J}) 最小値、インターバル長ある\(2 ^ {J-1 } \)

    同様\(D(I + 2 ^ {J - 1}、J - 1)\) を表し\を(A_ {iは+ 2 ^ {J-1}}、A_ {iは+ 2 ^ {J - 1 。+ 1}}、\ cdots、A_ ^ 2 {{I}は、J + 2 + 1-J ^ { - } 1 - 。1 J = I ^ 2 + - 。1} \)

    それは明らかである:\(D(I、J)は\)のように表すことができる:
    \分\ [D(I、J)= \ {D(I、J - 1)〜D(I + 2 ^ {J - 1。 }、J - 1)\} \]

  • クエリ:

    オーダー\(K \)満足する\を(2 ^ k個の≤のR - L + 1 \) である最大の整数\(K = \最大\ { T〜|〜2 ^ T≤R - L + 1、T \で\ mathbb Z ^ + \} \)

    同様に:\(K = [\ log_2(RL + 1)] \) このように:\(\ OperatorName {クエリ}(L、R&LT)= \ \分{D(L、K)〜D(R&LT - 2 ^ K + 1、k個の\ } \)

    クエリの時間複雑です\(O(1)\)

:各ので\(POW(2、X) \) 時間の無駄であり、内部バイナリコンピュータのように表すことができる:\(X - << 1 \)

コード:

namespace RMQ {
    
    void init(int n) {
        for (int i = 1; i <= n; i ++) d[i][0] = a[i];
                for (int j = 1; (1 << j) <= n; j ++) {
            for (int i = 1; i + (1 << j) - 1 <= n; i ++) {
                                d[i][j] = min(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);
    }
          
        int query(int l, int r) {
        int k = log2(r - l + 1);
        return min(d[l][k], d[r - (1 << k) + 1][k]);
    }
          
}

initサイクルため、見かけ上、反転することができない(J \)\の値、すなわち、間隔の長さが大きいと小さくします。

おすすめ

転載: www.cnblogs.com/jeffersonqin/p/11210907.html
おすすめ