スパーステーブルを使用した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++プログラムについても説明しました。このチュートリアルがお役に立てば幸いです。
-
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<
-
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