알고리즘 최적화. - 페이지 5

 
Mathemat :
예, 그렇습니다. 그러나 여전히 O(n) 이하입니다.
그 이하도 아닙니다 :) 좋은 상상력으로 지수 의존도를 줄일 수 있습니다 :)
 
Mathemat :

글쎄요, 최적화 문제가 아닙니다.

극한값을 찾는 것은 항상 O(n) 차수의 문제입니다. 여기서 n은 데이터 수입니다. 나는 이 점근적 행동이 어떻게 더 악화될 수 있는지 상상조차 할 수 없습니다.

가장 간단한 알고리즘은 ArraySort()를 정렬하는 것이며 내장형은 충분히 빠릅니다. 그러나 아마도 이 작업에는 과도할 것입니다.

더 빠른 재귀를 생각해낼 수 있습니다.

최소값과 막대 수를 얼마나 오래 검색합니까?

나는 첫 번째 게시물에서 통계를 제공했습니다. 1,000,000개의 막대에 대한 계산은 기간이 증가함에 따라 산술적으로 증가합니다. 따라서 기간 3의 경우 계산에 0.54초, 기간 51의 경우 0.94초, 기간 99의 경우 이미 1.59초가 걸립니다.

루프 내에서 루프를 사용하기 때문에 더 나빠집니다. 이는 실수입니다. 따라서 기간 3의 경우 반복 횟수는 1,000,000 * (3-1/2) = 1,000,000이지만 기간 99의 경우 1,000,000 * (99-1)/2 = 49,000,000입니다! 따라서 일정한 양의 데이터에 대한 반복 횟수가 주기의 증가에 따라 질적으로 증가하지 않는 방식으로 알고리즘을 다시 작성해야 하며 이는 순전히 최적화 문제입니다. 이제 이것이 내가 하는 일입니다. 지금까지 나는 이것을 썼습니다.

 static void Up( Bars MyQuotes)
        {
            BitArray bits = new BitArray(MyQuotes.Count);
             double max = double .MinValue;
             int pperiod = ( 23 - 1 ) / 2 ;
             int bar = pperiod;
             int count = MyQuotes.Count - pperiod;
             //последняя позиция второго перебора.
             int pos = bar;
             while (bar < count)
            {
                 for ( int i = 1 ; i <= pperiod; i++)
                {
                    max = MyQuotes.High[bar - i] > MyQuotes.High[bar + i]
                              ? MyQuotes.High[bar - i]
                              : MyQuotes.High[bar + i];
                    pos = bar + i;
                     if (max > MyQuotes.High[bar])
                    {
                        //Начинаем с последнего бара
                        bar = pos;
                        break ;
                    }
                     if (i == pperiod)
                    {
                        bits[bar + i] = true ;
                         bar = pos;
                    }
                }
            }
        }

최소값을 검색하기 위해 병렬 스레드에서 실행되는 적절한 Down() 함수가 있습니다. 두 기능이 모두 완료되면 해당 결과가 일반 목록에 추가됩니다. 이 같은.

 
C-4 : 첫 번째 게시물에서 통계를 제공했습니다. 1,000,000개의 막대에 대한 계산은 기간이 증가함에 따라 산술적으로 증가합니다. 따라서 기간 3의 경우 계산에 0.54초, 기간 51의 경우 0.94초, 기간 99의 경우 이미 1.59초가 걸립니다.

글쎄, 내가 망쳤어. 이것은 운수 진행의 합이 아닙니다, C-4 . 금액은 2차로 증가합니다.

확실히 OCL.

 
Mathemat :

가장 간단한 알고리즘은 ArraySort() 내장 정렬로, O(n * ln( n ) ) 영역에서 매우 빠릅니다. 그러나 아마도 이 작업에는 과도할 것입니다.

생각. 모든 정렬은 for를 사용하여 전체 배열을 반복하는 것보다 분명히 느립니다. For는 한 번의 반복을 제공하는 반면 arraysort는 기껏해야 모든 n개의 하위 창에서 값을 정렬합니다. 이는 그 자체로 수십 개의 작업을 의미합니다.

아니요, 결국 여기에서 총 반복 횟수 가 막대 수 와 질적으로 다르지 않도록 노력해야 합니다.

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
Mathemat :

글쎄, 내가 망쳤어. 이것은 운수 진행의 합이 아닙니다, C-4 . 금액은 2차적으로 증가합니다.

확실히 OCL.

2차라면 더 심각합니다. 내가 이해하는 것처럼 멀티스레딩은 필수 불가결합니다.
 

이와 같은 극한값 탐색의 조건은 , 말하자면 , 좀 이상하다 ... 하지만 그럼에도 불구하고 정면 탐색 방식을 사용하는 것은 지극히 비합리적이다.

ExtDepth = n인 원패스 클래식 ZigZag는 현재 상태를 약간 조정하면 바로 떠오릅니다. 여기서 OCL은 100% 불필요합니다.

 
남자들을 살아라. 세 개 모두.
 
hrenfx :

이러한 극한값 탐색의 조건은 냉정하게 말하면 이상하지만... 그럼에도 불구하고 정면 탐색 방식을 사용하는 것은 지극히 비합리적이다.

ExtDepth = n인 원패스 클래식 ZigZag는 현재 상태를 약간 조정하면 바로 떠오릅니다. 여기서 OCL은 100% 불필요합니다.

글쎄, 원칙적으로 나는 라지그재그를 위해 이러한 극단이 필요합니다. 그렇다면 구체적으로 어떤 알고리즘을 사용하는 것이 더 낫습니까? 두 번째 버전에서 제공한 것보다 더 효율적인 코드가 있습니까?
 
CodeBase MT4 - O(N)에서 원패스 ZigZag를 확인하십시오.
 
TheXpert : 남자들을 불태워라. 세 개 모두.

그리고 뭐? O(n)은 어떤 말을 해도 여전히 있을 것입니다.

다른 모든 방법이 실패하면 OCL을 시도하십시오. 5에서 dll 유형의 변태 없이는 다른 방법이 없습니다.