对复杂度为0(1)的索引范围内的值求和
sum values in a range of indices with O(1) complexity
给定一个整数向量(V[]
)和两个指标值,A
和B
。我们需要对V[A]
和V[B]
之间的所有整数求和。
例如
V[] == {0, 1, 2, 0, 4, 0, 3}, A == 2, B == 6
Sum == V[3] + V[4] + V[5] == 4
是否有可能解决O(1)
复杂性?我想过使用内存地址操作,但我仍然不确定它是如何工作的(类似于:从&V[A]
求和下一个(B-A)
地址值)
如果允许预处理,则可以使用辅助数组完成。
第二个数组的每个元素将包含相应元素和前面所有元素的和。此一次性预处理耗时O(n),空间O(n)。
例如:int Vsum[7];
Vsum[0] = V[0];
for (int i=1; i<7; i++) {
Vsum[i] = Vsum[i-1] + V[i];
}
对于给定的数组,相应的求和数组Vsum
将包含:
{0, 1, 3, 3, 7, 7, 10}
一旦你有了这个,你只需要执行两次查找:一次查找上界,一次查找下界。所以预处理后,每次执行得到的范围和为0(1)。
对于A==2和B==6的例子,您可以计算Vsum[B-1] - Vsum[A]
== 7 - 3
== 4
0(1)空格:没问题。但是对于"随机"数字总是需要O(n)时间。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 错误:未在此范围内声明'reverse'
- 并行用于C++17中数组索引范围内的循环
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 不计算一个范围内的完美数
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如何仅使用 While 循环在给定范围内找到可被 7 整除的计数整数
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 查找给定范围内最长连续 1 的频率
- 如何在一定范围内将无锁更新索引设置为最大值
- 如何在向量的给定索引范围内查找最小元素
- 对复杂度为0(1)的索引范围内的值求和