2014-01-29 3 views
0

Для вектора, содержащего более 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

'.at()' это плохо, имеет встроенные проверки границ, так что это будет один из самых медленных способов. – RichardPlunkett

+0

@RichardPlunkett: Ах, я никогда об этом не думал. Хорошая точка зрения! Какие-либо предложения? Сортировка первой? – slaw

+0

отсортирован по региону? если да, используйте lower_bound. если нет, используйте min_element для повторения. – billz

ответ

2
auto min = std::numeric_limits<double>::max(); 
for(auto& v : a) { 
    if(v < min && v != 0) { 
     min = v; 
    } 
} 

Довольно прямо. Если вы можете сохранить отсортированную подборку, вы можете сделать лучше, чем O (n). Вы в настоящее время используете .at(), несколько раз, который выполняет проверку границ.

+0

Хех, первая версия была отчасти разочаровывающей, но это лучше :) – RichardPlunkett

+0

@RichardPlunkett: Хе-хе, да, есть, держа ребенка, печатая одной рукой ... глупые ошибки. –

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

Почему вы пытаетесь найти линейно в этом векторе? Это худший случай. Просто сортировать вектор затем найдите наименьшее значение. просто не так ли? проверить код:

предположим, что,

vector <int> v; // it contains values 5,4,1,2,3 
sort(v.begin(),v.end()); //STL sort function 

затем v [0] наименьшее значение = 1

+0

Ужасный, O (N log N) и не const. Кроме того, не удается пропустить нулевые значения. – MSalters

-2

Вы можете попробовать использовать std::sort и std::upper.

std::sort(vec.begin(), vec.end()); 
auto upper = std::upper(vec.begin(), vec.end(), 0.0); 
std::cout << *upper; 
2

Стандартная функция для этого:

auto min = *std::min_element(begin(distances), end(distances), 
    [](double a, double b) { return b==0 || a<b; }); 
Смежные вопросы