使用稀疏表的 C++ 范围总和查询
c++server side programmingprogramming
Sparsh 表是一种数据结构,用于提供范围查询的结果。它以 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 的幂分解查询。创建稀疏表后,我们在该表中搜索查询,并在 (Left_index + 2^n - 1 <= Right_index ) 的条件下继续在变量中添加值,其中 n 是二维数组的列大小。
示例
上述方法的 C++ 代码
#include <bits/stdc++.h> using namespace std; // 稀疏表行的最大值。 const int m = 1e5; const int n = 16; long long SPARSE[m][n + 1]; // 借助稀疏表查找查询。 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]); // 构建稀疏表。 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++ 程序,我们可以使用 C、Java、Python 等编程语言来完成。我们希望本教程对您有所帮助。