我的代码适用于m
个对象,然后根据某些自定义条件仅返回某些 ' '
索引的结果。
以下是一个可靠的示例(查询字符串str
上的所有 std::vector<int> reports; //will keep index of ' ' in "str"
for(int i=0;i<N;i++){ // str.size() = "N"
bool condition = str.at(i)==' '; //"str" is string #B
if(condition){ //rarely true
reports.push_back(i);
}
}
//now reports.size() = m
个字符): -
m
在这些区块中,我知道N
始终小于或等于m << N
,通常 //int "N" is a local variable, it is not a constant.
std::vector<Input> inputs;
std::vector<Report> reports; //"Report" is any type of result, actually
int outOfLoopVariable=0;
for(int i=0;i<N;i++){
bool condition = some logic #B about "inputs[i]" and "outOfLoopVariable";
outOfLoopVariable= ....; //some complex logic #B
int var1 = ....; //some complex logic #B
//var2, var3, etc.
if(condition){ //rarely true
reports.push_back(Report(i,var1,var2,...));
}
}
。
在现实生活中,块更复杂,但共享类似的算法: -
#B
算法O(N)
的总复杂度= std::vector::push_back
,
但O(m*log(m))
的总复杂度=
m<<N
(O(N*log(N))
时)m~N
)时,#B
如 oLen 所述,这是完全错误的。 但是,我决定保留它作为参考。
(修改)算法vector
需要多次重新分配vector
。
如何使上述块的复杂度为O(N)?
(修改,感谢 oLen )如何避免对reports.reserve(N)
(1-&gt; 2-&gt; 4-&gt; ...)进行不必要的内部预留?
多年来,我一直通过以下方法解决这个问题: -
report
在第一次发言时 - 在大多数情况下这是一种过度保留
当N
是一个大对象并且m
非常大(有问题,10000 +)时,这真的很糟糕。reserve(m)
。 reports.push_back(i);
。 lambda[&]
#B
部分解决,稍微牺牲可读性)O(2*n)
的复杂性现在是O(1.x*n)
replication:
replSetName:rs0
oplogSizeMB:100
master:true
如果我可以省略第一个循环的某些计算。我希望有更好的方法。
答案 0 :(得分:1)
答案:只是不要更改您的代码,也不要使用reserve
。
std::vector::push_back
的复杂性是不变的(考虑amortized time),所以只要使用它就可以了。
答案 1 :(得分:1)
有第三种方法:使用链接列表report
。没有过度预订。没有额外的循环。
但可能会慢一些。