Алгоримт. По сути там среднеквадратическое отклонение используется.
Только вам придется писать цикл типа:
for count = минимальное количество данних для кореляции
to максимальное количество данних для кореляции
for i = 0 to length(DataArray) - count
correlationList.append(caclCorrelation(DataArray, i, count)
Что бы найти найболее подобною последовательность.
Для оптимизации можно на первом этапе выбросить большую часть даних. (ака метод Монте-Карло). Обычно достаточно и 2% даних.
А на втором этапе (когда у тебе уже будут "правильные" диапазоны) уже все даные посмотреть.
Один из методов считания уровня ошибки это имерить в 2 разы точнее — разница межну измерениями и будет оценкой уровня ошибки.
т. е. можна сделать алгоритм типа:
dataCountCoeficient = 0.001 // 0.1%
needAccuracy = 0.01 // 1%
oldResult = calcCorrelation(dataCountCoeficient / 2);
newResult = calcCorrelation(dataCountCoeficient)
while Abs(oldResult - newResult) / Max(Abs(OldResult), Abs(NewResult)) > needAccuracy do
dataCountCoeficient *= 2
oldResult = newResult
newResult = calcCorrelation(dataCoutCoeficient)