找到向量中的最小数字

时间:2014-01-29 03:50:45

标签: c++ sorting vector

给定包含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);
  }
} 

我考虑先对矢量进行排序,然后取第一个非零值,但我希望有人可以提供更快的优化方法。

5 个答案:

答案 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::sortstd::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