给定包含5000+元素(距离)的向量,确定最小非零值的最快方法是什么?目前,我有这样的天真:
double distance=1E10; //I know that my distances are always less than this
for (unsigned int i=0; i< a.size(); i++){
if (a.at(i) < distance && a.at(i) != 0){
distance=a.at(i);
}
}
我考虑先对矢量进行排序,然后取第一个非零值,但我希望有人可以提供更快的优化方法。
答案 0 :(得分:2)
auto min = std::numeric_limits<double>::max();
for(auto& v : a) {
if(v < min && v != 0) {
min = v;
}
}
非常直接。如果你可以对集合进行排序,那么你可以做得比O(n)更好。您当前正在多次使用.at()
,执行边界检查。
答案 1 :(得分:2)
标准功能:
auto min = *std::min_element(begin(distances), end(distances),
[](double a, double b) { return b==0 || a<b; } );
答案 2 :(得分:0)
一些简单且非常快速的方法。
double best=1E10; //I know that my distances are always less than this
for (unsigned int i=0; i< a.size(); i++){
if (a[i] < best && a[i] != 0){
best=a[i];
}
}
double best=1E10; //I know that my distances are always less than this
for (auto it = a.begin(); it!= a.end(); ++it){
if (*it < best && *it != 0){
best=*it;
}
}
答案 3 :(得分:-2)
您可以尝试使用std::sort
和std::upper
。
std::sort(vec.begin(), vec.end());
auto upper = std::upper(vec.begin(), vec.end(), 0.0);
std::cout << *upper;
答案 4 :(得分:-3)
为什么要尝试在该向量中线性搜索?这是最糟糕的情况。只需排序向量,然后找到最小的值。简单不是吗? 检查代码:
假设,
vector <int> v; // it contains values 5,4,1,2,3
sort(v.begin(),v.end()); //STL sort function
然后 v [0] 是最小值= 1