C++ 求向量中的最小数
给定一个包含5000+个元素的向量距离,确定最小非零值的最快方法是什么?目前,我有一些天真的想法:C++ 求向量中的最小数,c++,sorting,vector,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); }
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);
}
}
我考虑过先对向量排序,然后取第一个非零值,但我希望有人能提供更快的优化方法
auto min = std::numeric_limits<double>::max();
for(auto& v : a) {
if(v < min && v != 0) {
min = v;
}
}
非常直截了当。如果您可以保持集合的排序,那么您可以做得更好。您当前多次使用.at,它执行边界检查。一些简单且速度稍快的方法
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;
}
}
为什么要在向量中线性搜索?这是最坏的情况。只需对向量排序,然后找到最小值。很简单,不是吗? 检查代码: 假设
vector <int> v; // it contains values 5,4,1,2,3
sort(v.begin(),v.end()); //STL sort function
那么v[0]是最小的值=1您可以尝试使用std::sort和std::upper
此功能的标准功能:
auto min = *std::min_element(begin(distances), end(distances),
[](double a, double b) { return b==0 || a<b; } );
.at不好,is内置了边界检查,所以这将是最慢的方法之一。@RichardPlunkett:啊,我从没想过。说得好!有什么建议吗?先排序?向量排序了吗?如果是,请使用下限。如果没有,使用min_元素进行迭代。使用[i],或者更好一些,使用迭代器或内置循环。不,向量没有分类。第一个版本有点令人失望,但这更好:@RichardPlunkett:Heh,是的,吃东西,抱着婴儿,用一只手打字。。。愚蠢的错误。可怕,在日志N和非常量上。此外,无法跳过零值。
auto min = *std::min_element(begin(distances), end(distances),
[](double a, double b) { return b==0 || a<b; } );