Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Август 11, 2017, 15:04



Название: [РЕШЕНО] Быстрый поиск ближайшего значения
Отправлено: deMax от Август 11, 2017, 15:04
Как быстро найти число в массиве больше заданного? Допусти {1,10,100,150} на 15 вывести 100.
Есть QMap::lowerBound(const Key &key) вроде то что нужно, но придется хранить значения для ключей.


Название: Re: Быстрый поиск ближайшего значения
Отправлено: Bepec от Август 11, 2017, 16:09
Ну, если массив маленький( до 10к), то проще отсортировать и пройтись.
Если массив средний, то ассоциативные контейнеры помогут.
Если массив ахренительный, то разбивать поиск по частям, параллельно.
Если данных ну просто офилиард, то загнать всё нафиг в sql и туда гонять запросы :D


Название: Re: Быстрый поиск ближайшего значения
Отправлено: m_ax от Август 11, 2017, 20:01
Как быстро найти число в массиве больше заданного? Допусти {1,10,100,150} на 15 вывести 100.
Есть QMap::lowerBound(const Key &key) вроде то что нужно, но придется хранить значения для ключей.
Если предполагается, что последовательность отсортирована, то стандартный std::lower_bound, а если нет.. То да, фактически остаётся перебор
Код
C++ (Qt)
template <class InputIt>
InputIt greater_than(InputIt first, InputIt last, int val)
{
   auto it_res = std::find_if(first, last, [&](int x){ return x >= val; });
   if (it_res == last)
       return last;
 
   first = it_res;
 
   while ((first = std::find_if(++first, last, [&](int x){ return x >= val; })) != last)
   {
       if (*first <= *it_res)
           it_res = first;
   }
 
   return it_res;
}
 


Название: Re: Быстрый поиск ближайшего значения
Отправлено: Igors от Август 12, 2017, 06:31
std изучается настолько усердно что упускается то немногое ценное что там есть  :) Ну какое же lower_bound если больше заданного? Для этого есть std::upper_bound. Конечно в любом случае требуется сортированный массив

Да, и кстати это работает быстрее ассоциативного контейнера


Название: Re: Быстрый поиск ближайшего значения
Отправлено: deMax от Август 14, 2017, 07:40
Спасибо. std::lower_bound подойдет, не знал, не пользовался  :-[ (хотя QMap::lower_bound приходилось использовать)

Массив очень маленький, просто шерстить его нужно в paintevent.