Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何增加c+中向量中k个连续元素的值+;? 假设我们在8的C++中有一个向量,元素{ 0, 1, 1,0, 0, 0,1, 1 },并且我想把向量的一个特定部分的大小增加一个,例如,假设需要增加1的向量的部分是0到5,那么我们的最终结果是{1, 2, 2,1, 1, 0,0, 1, 1 }。_C++ - Fatal编程技术网

如何增加c+中向量中k个连续元素的值+;? 假设我们在8的C++中有一个向量,元素{ 0, 1, 1,0, 0, 0,1, 1 },并且我想把向量的一个特定部分的大小增加一个,例如,假设需要增加1的向量的部分是0到5,那么我们的最终结果是{1, 2, 2,1, 1, 0,0, 1, 1 }。

如何增加c+中向量中k个连续元素的值+;? 假设我们在8的C++中有一个向量,元素{ 0, 1, 1,0, 0, 0,1, 1 },并且我想把向量的一个特定部分的大小增加一个,例如,假设需要增加1的向量的部分是0到5,那么我们的最终结果是{1, 2, 2,1, 1, 0,0, 1, 1 }。,c++,C++,是否可以使用标准的向量方法(如c中的memset)在恒定时间内完成此操作,而不运行任何循环?否。。。顺便说一句,使用memset也不能保证恒定时间操作(在大多数实现中只是非常快,但在元素数量上仍然是线性的) 如果您需要对一个非常大的向量多次执行此类操作(对一个范围内的常数进行加法/减法),并且需要得到最终结果,那么您可以使用不同的算法每次更新得到O(1): 步骤1:将数据转换为其“导数” 这意味着用上一个元素的差异替换每个元素 // O(n) on the size of the vector,

是否可以使用标准的向量方法(如c中的memset)在恒定时间内完成此操作,而不运行任何循环?

否。。。顺便说一句,使用
memset
也不能保证恒定时间操作(在大多数实现中只是非常快,但在元素数量上仍然是线性的)

如果您需要对一个非常大的向量多次执行此类操作(对一个范围内的常数进行加法/减法),并且需要得到最终结果,那么您可以使用不同的算法每次更新得到O(1):

步骤1:将数据转换为其“导数” 这意味着用上一个元素的差异替换每个元素

// O(n) on the size of the vector, but done only once
for (int n=v.size()-1; i>0; i--) {
    v[i] -= v[i-1];
}
步骤2:执行所有的间隔操作(每个操作在固定时间内) 在这种表示法中,将常数添加到范围仅仅意味着将其添加到第一个元素,并从超过结束元素的元素中减去它。代码:

// intervals contains structures with start/stop/value fields
// Operation is O(n) on the **number of intervals**, and does
// not depend on the size of them
for (auto r : intervals) {
    v[r.start] += r.value;
    v[r.stop+1] -= r.value;
}
// O(n) on the size of vector, but done only once
for (int i=1,n=v.size(); i<n; i++) {
    v[i] += v[i-1];
}
步骤3:收集结果 最后,您只需要取消初始处理,通过积分恢复每个单元格上的正常值。代码:

// intervals contains structures with start/stop/value fields
// Operation is O(n) on the **number of intervals**, and does
// not depend on the size of them
for (auto r : intervals) {
    v[r.start] += r.value;
    v[r.stop+1] -= r.value;
}
// O(n) on the size of vector, but done only once
for (int i=1,n=v.size(); i<n; i++) {
    v[i] += v[i-1];
}
//O(n)关于向量的大小,但只执行一次

对于(int i=1,n=v.size();iMemset不是一个常数时间操作。您需要在需要更新的段之间循环。或者您可以尝试不同的数据结构,例如具有延迟传播的段树。
。您的更新将是常数,但检索将是日志(n).yeah@sameerkn至少比在整个段中运行循环要好。在“步骤3:收集结果”中,它应该是
for(int i=1,n=v.size();i@6502谢谢,我把代码运行时间从1.89秒缩短到了0.37秒