C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

スパーステーブルを使用したC++範囲合計クエリ


Sparsh Tableはデータ構造であり、範囲クエリの結果を提供するために使用されます。これは、O(logN)の複雑さでほとんどの範囲クエリの結果を提供します。最大範囲クエリの場合、O(1)で結果を計算することもできます。

このチュートリアルでは、配列が指定されているスパーステーブルを使用した範囲合計クエリの問題について説明します。たとえば、範囲LとRのすべての要素の合計を見つける必要があります。

Input: arr[ ] = { 2, 4, 1, 5, 6, 3 }
query(1, 3),
query(0,2),
query(1, 5).

Output: 10
7
19

Input: arr[ ] = { 1, 2, 3, 4, 1, 4 }
query(0, 2),
query(2,4),
query(3, 5).

Output: 6
8
9

解決策を見つけるためのアプローチ

まず、スパーステーブル内の回答を検索するためにスパーステーブルを作成する必要があります。スパーステーブルの作成では、回答を格納するために2次元配列を使用します。スパーステーブルでは、2の累乗でクエリを分割します。スパーステーブルを作成した後、そのテーブルでクエリを検索し、(Left_index + 2 ^ n --1 <=Right_indexの条件で変数に値を追加し続けます)ここで、nは2次元配列の列のサイズです。

上記のアプローチのC++コード

#include <bits/stdc++.h>
using namespace std;
// Maximum value of row of sparse table.
const int m = 1e5;
const int n = 16;
long long SPARSE[m][n + 1];
// query to be found with the help of a sparse table.
long long query(int l, int r){
    long long sum = 0;
    for (int i = n; i >= 0; i--) {
        if (l + (1 << i) - 1 <= r) {
            sum = sum + SPARSE[l][i];

            l += 1 << i;
        }
    }
    return sum;
}
int main(){
    int arr[] = {  1, 2, 3, 4, 1, 4 };
    int z = sizeof(arr) / sizeof(arr[0]);
    // Building sparse table.
    for (int i = 0; i < z; i++)
        SPARSE[i][0] = arr[i];
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= z - (1 << j); j++)
            SPARSE[j][i] = SPARSE[j][i - 1] + SPARSE[j + (1 << (i - 1))][i - 1];
    cout <<"Sum: " << query(0, 2) << endl;
    cout <<"Sum: " << query(2, 4) << endl;
    cout <<"Sum: " << query(3, 5) << endl;
    return 0;
}

出力

Sum: 6
Sum: 8
Sum: 4

結論

このチュートリアルでは、さまざまなクエリに非常に役立つスパーステーブルの作成について説明しました。スパーステーブルを作成し、そのテーブルからクエリを取得することで、この問題を解決する簡単なアプローチについて説明しました。また、C、Java、Pythonなどのプログラミング言語で実行できるこの問題のC++プログラムについても説明しました。このチュートリアルがお役に立てば幸いです。


  1. C ++を使用して、数の因数の最小合計を求めます。

    ここでは、与えられた数の因子の最小合計を取得する方法を見ていきます。数が12であると仮定します。これはさまざまな方法で因数分解できます- 12 =12 * 1(12 + 1 =13) 12 =2 * 6(2 + 6 =8) 12 =3 * 4(3 + 4 =7) 12 =2 * 2 * 3(2 + 2 + 3 =7) 最小の合計は7です。数値を取り、最小の因子の合計を見つけようとします。最小の因数分解の合計を取得するには、可能な限り数を因数分解する必要があります。言い換えれば、素因数を足して合計Sを求めようとすると、その合計は最小化されると言えます。 例 #include<

  2. C++でポインタ演算を使用した配列の合計

    これは、ポインタを使用して配列要素の合計を見つけるC++プログラムです。 アルゴリズム Begin    Initialize the array elements with values from user input.    Initialize s = 0    Loop for i = 0 to       s = s + *(ptr + i)    Print the sum value in variable s. End サンプルコード #include<iostr