Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с графиками функций (https://javascript.ru/forum/misc/67781-rabota-s-grafikami-funkcijj.html)

TimohaP 07.03.2017 20:56

Работа с графиками функций
 
Вот есть у меня функция, она там себе поработала и записала результаты в массив:
arr = [1,2,3,4,4,5,6,5,5,1,2,3,5,4,6,2,1]

Не так уж и сложно найти наибольшее или наименьшее значение массива, и определить его амплитуду. Но у меня проблема иначе: нужно найти самую долгую волну из самыми большими значениями, которую создает массив.
Чтобы было легче представить, вот тот же массив в виде гистограммы:

Для начала, волна - это такая область значений, где есть область спадания и область роста. Если после области спадания начался рост - то это уже совсем вторая волна. На рисунке они обозначены красными линиями, пересекающими гистограмму.
Теперь длинна волны - это количество в ней значений.
Сила волны - сума всех значений, которая она содержит.
Нужно: найти самую долгую и самую сильную волну и возвратить координаты ее начала, конца и суммы элементов.
У меня была идея перебирать массив циклом и как то вот так искать все это, но это немного сложно в плане реализации. Нужно ли запоминать все волны и потом их сравнивать, есть способ попроще? Какой цикл лучше использовать? Поэтому прошу помощи у вас.

Alexandroppolus 07.03.2017 21:24

Цитата:

Сообщение от TimohaP
Нужно ли запоминать все волны и потом их сравнивать, есть способ попроще?

нужно запоминать только самую долгую волну, и самую сильную (для каждой запоминать начало и конец, а для самой сильной - ещё и силу).
обходить массив циклом for.
помнить текущее состояние ("подъем" или "спад"). Если на спаде вдруг оказалось, что a[i] > a[i-1], то началась новая волна. У текущей сравнить длину и силу с лидерами, если что - запомнить.

рони 07.03.2017 21:39

TimohaP,
вы уверены что волны 9, 5, 3 а не 9, 4, 4?
[[1,2,3,4,4,5,6,5,5],[1,2,3,5],[4,6,2,1]]

TimohaP 07.03.2017 22:16

Alexandroppolus,
окей, спасибо, я попробую так сделать.
рони,
а вот тут с точки зрения логики спорно, знаешь -_-
хотя да, по тому, как я описал алгоритм, ты все-таки прав

рони 07.03.2017 22:54

:write:
{"rez":[[1,2,3,4,4,5,6,5,5],[1,2,3,5],[4,6,2,1]],"maxSum":{"begin":0,"sum":35,"len":9},"maxLen":{"begin":0,"sum":35,"len":9}}

nerv_ 08.03.2017 13:43

Цитата:

Сообщение от TimohaP
На рисунке они обозначены красными линиями, пересекающими гистограмму.

что-то я не уверен, что у тебя тут три волны, а не две. На интервале от 10 до 17 отметка 14 - по мне так локальный минимум, а не третья волна

https://ru.wikipedia.org/wiki/Нормальное_распределение

https://ru.wikipedia.org/wiki/Фун...BD.D0.B8.D0.B9

Diphenyl Oxalate 08.03.2017 19:33

Цитата:

Сообщение от TimohaP (Сообщение 446699)
Если после области спадания начался рост - то это уже совсем вторая волна

Тогда волны были бы следующими:

Цитата:

0-7 рост
7-9 спад
9-13 рост
13-14 спад
14-15 рост
15-17 спад
А у вас на гистограмме непонятно что, и непонятно как с этим работать.

Или новая волна начинается только после резкого спада/роста? Тогда почему третья волна начинается не с 15, а с 14?


Часовой пояс GMT +3, время: 01:30.