我有一个O(N^2)
程序,我注意到使用迭代器和索引之间的巨大差异,我在这里粘贴代码和数据:
代码:
#include <string>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main(int argc, char* argv[]){
ifstream ifile("csv.csv");
string s;
vector<long> vec_frd;
vector<long> vec_real_frd;
while (getline(ifile, s)){
string s2 = s.substr(0, s.find(','));
vec_frd.push_back(stol(s.substr(0, s.find(','))));
}
long real_frd;
// using iterator
vector<long>::iterator it1, it2;
for (it1=vec_frd.begin(); it1<vec_frd.end(); it1++){
if (*it1 == -1){
vec_real_frd.push_back(-1);
continue;
}
real_frd = *it1;
for (it2=it1; it2<it1+*it1 && it2<vec_frd.end(); it2++){
if (*it2 == -1)
real_frd --;
}
vec_real_frd.push_back(real_frd);
}
// using index
// for (unsigned int i=0; i<vec_frd.size(); i++){
// if (vec_frd[i] == -1){
// vec_real_frd.push_back(-1);
// continue;
// }
// real_frd = vec_frd[i];
// for (unsigned int j=i; j<i+vec_frd[i] && j<vec_frd.size(); j++){
// if (vec_frd[j] == -1)
// real_frd --;
// }
// vec_real_frd.push_back(real_frd);
// }
ifile.close();
return 1;
}
数据: https://www.dropbox.com/s/c2c7txhu24xy06r/csv.csv?dl=0
如果我们使用迭代器,在我的机器上它需要将近30秒,如果我们使用索引,它需要5秒,我是C ++的新手,这种性能差异是否正常?或者我错了?
答案 0 :(得分:2)
回答你的问题 - 不,这种行为对于优化的代码来说绝对不正常 我无法用gcc或MSVC重现它。我认为最好的办法是仔细检查您的编译器选项。
另一方面,我相信你可以通过一些算法调整来加快这项任务的速度。即使渐近,我也很确定你可以通过预先计算几个计数器来从O(N^2)
转到O(N)
。