Все ли у вас доступно множество очков? И нет ли ограничений на «форму» функции, которую представляют эти точки? Если это так, то вы, вероятно, застряли, итерация по точкам будет вашим лучшим выбором ...
Хотя, если у вас есть какая-то другая работа с этим набором, вы можете отсортировать ее по Y-координатам для использования при дальнейшей обработке.
(Держите оба массива рядом - тот, который вы вводили в качестве входных данных (вероятно, он отсортирован по x-corrd?), И тот, который отсортирован по значению функции (y-координата)) ...
Редактировать: если вы знаете, что кривая всегда будет иметь форму, подобную части кривой Sin / Cos, тогда , если вы знаете наименьший период, который может быть представлен , вы можете выполнить некоторые оптимизации, используя алгоритм бинарного поиска, чтобы «искать» точки перегиба (где наклон (изменение Y влево и вправо) имеют разные знаки. Для каждой точки, исследуемой на влево переместите вправо на куски = половину допустимого периода, пока не найдете точку перегиба или знак изменения наклона ... Затем вернитесь на половину последнего изменения x, пока не найдете точку перегиба. [ Сделайте обратное для точек справа]
Рекурсивная процедура, которая исследует / находит первую и последнюю точку перегиба, сравнивает их, чтобы определить, какая из них максимальна, а затем рекурсивно исследует и находит точку заражения на полпути между ними, пока две задействованные точки не станут меньше наименьшего допустимого период, следующий друг за другом, приведет к некоторому приросту производительности ...
2-е РЕДАКТИРОВАНИЕ : Так как я прочитал за год другой комментарий, этот набор никогда не будет содержать более одной точки перегиба ... Если это так, то просто выполните бинарный поиск, чтобы найти его.
PsuedoCode:
Check Leftmost point to see slope (Up Down or Zero)
If Zero, done
Check RightMost Slope
If Zero - Done
If two Slopes are same sign - Done
- pick Bigger of two points ( - or smaller if looking for min)
Check point in the Middle slope
If Zero, Done
If slope has same sign as left pt, Change Left to this Point and repeat
If slope has same sign as right pt, Change Right to this Point and repeat