Алгоритм поиска наибольшего среднего арифметического некой последовательности - страница 3

 
AndreiFAN:

Я имел ввиду что-то типа этого:

 


вот так узнаете сколько итераций получается в общем:

///////////////////////////////

double Buffer[1000];

// тут присваиваем значения элементам буфера...

// 

// далее находим то что нам нужно

int N=20;

double MaxSumm=0;

int IndexFind=0;
int k=0;
for(int i=0; i<ArraySize(Buffer)-N; i++)

{

   double Summ=0;

   for(int ii=0; ii<N; ii++)

   {

      int iii=i+ii;
      k++;
      Summ=Summ+Buffer[iii];

   }

   if(Summ>MaxSumm)

   {

      MaxSumm=Summ;

      IndexFind=i;

   }

}

Alert("Максимальная сумма элементов с "+IndexFind+" элемента в массиве"); 

Print(k);
 
AndreiFAN:

не совсем понял...  45 и 20...  опечатка?

Так вот, а зачем вам суммы нескольких первых элементов, количественно меньше ? Сумма первых пяти например, зачем? 

Потому я и сделал i<ArraySize(Buffer)-N   чтобы не смотреть последние...

Ок. Наверно можно и так. 

Кстати, да, в моём примере можно не складывать а отнимать один элемент начальный, и прибавлять следующий в массиве....  

Не знаю что быстрее...  пробежаться по циклу, или писать ещё в один массив. 

количество элементов не имеет значения, автору нужно было не менее 45

ЗЫ: быстрее писать, приобретаем скорость увеличиваем память и наоборот.

 
AndreiFAN:

не совсем понял...  45 и 20...  опечатка?


да,там очепятка, поправил
 
ALXIMIKS:

а вдруг максимум машки с периодом 50 больше?

Вот пример 

Максимум машки с периодом 50 не может быть больше тк максимум будет локализоваться вокруг выброса.

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

Вот машка с периодом 44 может быть больше машки с периодом 45, но по условиям задачи 45 наименьший период, а значит отражение выбросов на 45-периодной машке будут наиболее выраженными среди остальных перидов.

Для проверки набросьте на чарт несколько машек с разными периодами и убедитесь что максимумы машек с меньшими периодами выше. 

 

График EURUSD, M15, 2014.09.08 19:22 UTC, Alpari Limited, MetaTrader 5, Demo
 
sanyooooook:

вот так узнаете сколько итераций получается в общем:

А вот так? Итераций будет по размеру буфера

double Buffer[1000];
// тут присваиваем значения элементам буфера...
// 
// далее находим то что нам нужно
int N=20;
double MaxSumm=0;
int IndexFind=0;

/// считаем сумму первых N элементов
double Summ=0;
for(int i=0; i<N; i++)
{
   Summ=Summ+Buffer[i];
   MaxSumm=Summ;
}
for(int i=1; i<ArraySize(Buffer)-N; i++)
{
   Summ=Summ-Buffer[i-1]+Buffer[i+N-1];
   if(MaxSumm<Summ){MaxSumm=Summ; IndexFind=i;}
}
Alert("Максимальная сумма элементов с "+IndexFind+" элемента в массиве");
 
AndreiFAN:

А вот так? Итераций будет по размеру буфера

а так что-то не то получается, нужно тестировать уже )
 
Urain:

максимум машки с периодом 50 не может быть больше тк максимум будет локализоваться вокруг выброса.

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

Вот машка с периодом 44 может быть больше машки с периодом 45, но по условиям задачи 45 наимпеньший период, а значит отражение выбросов на 45-периодной машке будут наиболее выраженными среди остальных перидов.

Для проверки набросьте на чарт несколько машек с разными периодами и убедитесь что максимумы машек с меньшими периодами выше. 

Логично подумайте и поймете ошибочность вашего утверждения:

Выберите последовательность не меньше 3 длиной с максимальным средним арифметическим  значением { 1, 2, 10 , -1, 4, 3, -3, 10, 1} 

 
sanyooooook:

количество элементов не имеет значения, автору нужно было не менее 45

ЗЫ: быстрее писать, приобретаем скорость увеличиваем память и наоборот.

А, ну значит я не совсем понял задачу. Если НЕ МЕНЕЕ, то да. Ваш вариант. Только из массива сумм проще выбрать в конце через ArrayMaximum
 
ALXIMIKS:

Логично подумайте и поймете ошибочность вашего утверждения:

Выберите последовательность не меньше 3 длиной с максимальным средним арифметическим  значением { 1, 2, 10 , -1, 4, 3, -3, 10, 1} 

Максимальное среднее значение будет будет 4.3... в периоде, последовательность будет длинной 3, данные создающие этот максимум будут { 1, 2, 10} и {10, -1, 4}.    13/3=4.333333

Все остальные вариации дадут меньшее среднее. 

ЗЫ кстати если мало данных а длинна периода сопоставима, можно закольцевать буффер чтоб краевые условия не сказывались на результат.

Вот если бы можно было не последовательно высчитывать среднее а на выборочных данных, тогда да, тогда мешки не подходят. 

 
ALXIMIKS:

Логично подумайте и поймете ошибочность вашего утверждения:

Выберите последовательность не меньше 3 длиной с максимальным средним арифметическим  значением { 1, 2, 10 , -1, 4, 3, -3, 10, 1} 

Urain прав. Это как бы и доказывать не требуется. Если разговор о Максимумах, а не текущих значениях... Текущее значение у МА с большим периодом может быть больше Максимума быстрой МА, но это будет не Максимум МА медленной.
Причина обращения: