주어진 요소의 배열 지우기 - 페이지 11

 
Nikolai Semko :

브라보! 몇 가지 오류를 수정한 후 ArrayCopy를 사용하지 않고도 저를 받침대에서 떨어뜨렸습니다. 장군. :))

변경할 가치가있을 수 있습니다
 for (;;)


 while ( true )

어쨌든 휴식 을 통해 종료

추신: 관심을 끌기 위해 전체 어레이에 대해 직접 복사를 실행했습니다.
 template < typename T>
int arrayFilter(T &data[], const T value)
  {
     int s, _s = s = ArraySize (data);
     bool result = false ;
     
     for ( int i= 0 , j= 0 ; i<_s; i++)
     {
           if ( data[i] == value )
          {
               result = true ;
               s--;
               continue ;
          }
           if ( result )
               data[j] = data[i];
          j++;
     }
     
     if (s < _s)
           ArrayResize (data, s);
     
     return s;
  }
 
Konstantin Nikitin :
변경할 가치가있을 수 있습니다


어쨌든 휴식 을 통해 종료

차이 없음. 무한 루프 중에서 저는 더 좋아합니다. 왜냐하면. short와 true는 초보자를 혼동하지 않습니다.
 
MT5 / ME 옵티마이저(빌드 1945) 개발자의 정원에 있는 돌.
단말기 Windows 10(빌드 17134) x64, IE 11, UAC, Intel Core i7-7700HQ @ 2.80GHz, 메모리: 5276/16250Mb


코드를 작성해야 하는 이유:
arr[j++] = arr[i];

다음보다 느리게 실행:
arr[j] = arr[i];
j++;



규칙 없이 이 대회에 참가하면 "리더" 코드(현재 Kuznetsov임)를 복사하고 위에서 설명한 시스템 동작에 따라 변경합니다.
초기 740ms 실행 시간에서 약 20ms의 안정적인 이득을 얻습니다.

 template < typename T>
int arrayFilter_ALXIMIKS(T &arr[], const T x)   // вариант ALXIMIKS
{
         int i= 0 ;
         int j= ArraySize (arr)- 1 ;
         for (;;) {
                 while (arr[i]!=x && i<j) i++;
                 while (arr[j]==x && i<j) j--;
                 if (i<j) {
                        arr[i]=arr[j];
                        i++;
                        j--;
                } else break ;
        }
         ArrayResize (arr,j);
         return j;
}
 

그건 그렇고, 원래 배열이 시리즈와 같다면 결과가 어떻게 바뀔지 궁금합니다. ArraySetAsSeries (arr,true)

 
Sergey Dzyublik :
규칙 없이 이 대회에 참가하면 "리더" 코드(현재 Kuznetsov임)를 복사하고 위에서 설명한 시스템 동작에 따라 변경합니다.

초기 740ms 실행 시간에서 약 20ms의 안정적인 이득을 얻습니다.

추가할 가치가 있습니다. 배열 요소 의 순서가 중요하지 않은 경우. 예, 훌륭한 옵션입니다. 일관성이 중요하다면 다른 것이 필요합니다.

 

그런 술이 사라졌기 때문에 여기 내 버전이 있습니다.

 int SokolovDelRetry( int &array[], const int val)
{
   int total = ArraySize(array);
   int in = - 1 , count = 0 , diff = 0 ;
   for ( int i = 0 ; i < total; i++)
   {
      diff++;
       if (array[i] == val)
      {
         diff--;
         if ( in != - 1 )
         {
             if (diff> 0 )
            {
               ArrayCopy(array, array, in , i-diff, diff);
               in = in + diff;
               diff = 0 ;
            }
            count++;
         }
         else
         {
             in = i;
            diff = 0 ;
            count++;
         }
      }
   }
   if (diff > 0 )
      ArrayCopy(array, array, in , total - diff, diff);
   ArrayResize(array, total - count);
   return total - count;
}

결과:

 2018.11 . 14 16 : 20 : 15.293 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pastushak: Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 89383 микросекунд
2018.11 . 14 16 : 20 : 15.313 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Korotky:   Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 18148 микросекунд
2018.11 . 14 16 : 20 : 15.337 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Fedoseev:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 15637 микросекунд
2018.11 . 14 16 : 20 : 15.347 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Semko:     Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 4626 микросекунд
2018.11 . 14 16 : 20 : 15.367 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pavlov:    Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 16976 микросекунд
2018.11 . 14 16 : 20 : 15.407 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Nikitin:   Контрольная сумма = 495345526 ; элементов - 997945 ; время выполнения = 27381 микросекунд
2018.11 . 14 16 : 20 : 15.427 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Vladimir:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 16178 микросекунд
2018.11 . 14 16 : 20 : 15.457 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Peter:     Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 19618 микросекунд
2018.11 . 14 16 : 20 : 15.477 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Sokolov:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 11058 микросекунд

Z.s. 원칙적으로 제한 속도에 도달했습니다. 또한 for 루프를 사용한 미세 최적화 및 샤머니즘:

이러한 미세 최적화를 능숙하게 사용한 것이 Nikolay의 결과라고 생각합니다.

파일:
 
Vladimir Pastushak :

1,2,3,6,9,5,6,3,25,6,8,7,4 유형의 데이터 세트를 포함하는 배열이 있습니다. 예를 들어 3의 값은 다음과 같아야 합니다. 삭제되고 출력은 3과 빈 공간이 없는 동일한 배열이 됩니다. ...

정크 값 배열을 지우는 가장 빠른 방법을 찾고 있습니다...

예가 떠오른다

더 저렴하고 빠른 방법이 있습니까?

블라디미르, 이것이 왜 필요한가요?
내가 이해하는 한 이것은 표시기 버퍼 로 수행되어야 합니다. 그러나 빈 값 및 (또는) "추가" 값을 이전 값 또는 예를 들어 극한 값의 산술 평균으로 바꾸는 것이 더 논리적이지 않습니까? 그러면 훨씬 빠르게 수행되고 배열 차원은 동일하게 유지됩니다.

 
Nikolai Semko :

블라디미르, 이것이 왜 필요한가요?
내가 이해하는 한 이것은 표시기 버퍼 로 수행되어야 합니다. 그러나 빈 값 및 (또는) "추가" 값을 이전 값 또는 예를 들어 극한 값의 산술 평균으로 바꾸는 것이 더 논리적이지 않습니까? 그러면 훨씬 빠르게 수행되고 배열 차원은 동일하게 유지됩니다.

이것은 정보, 많은 양의 정보를 표시하고 이를 기반으로 추가 계산을 수행하는 데 필요합니다. 이러한 종류의 함수는 관련 없는 데이터 배열을 지우는 데 필요합니다. 그리고 가장 중요한 것은 매우 빠르게 작동해야 한다는 것입니다! 내 아날로그는 속도면에서 모든 사람보다 열등하므로 정보를 표시할 때 프리즈가 발생합니다.

 
Nikolai Semko :

블라디미르, 이것이 왜 필요한가요?
내가 이해하는 한 이것은 표시기 버퍼 로 수행되어야 합니다. 그러나 빈 값 및 (또는) "추가" 값을 이전 값 또는 예를 들어 극한 값의 산술 평균으로 바꾸는 것이 더 논리적이지 않습니까? 그러면 훨씬 빠르게 수행되고 배열 차원은 동일하게 유지됩니다.

mql4에서 많은 수의 오픈 포지션/오더를 가진 여러 Expert Advisors와 함께 일할 계획이라면, 제 생각에는 티켓이 있는 어레이를 유지하고 이 어레이를 정렬하는 대신 주문이 마감되었는지 여부를 제어하는 것이 더 쉽습니다. 기호와 마법을 확인하여 열려 있는 모든 항목을 반복합니다. 따라서 주문이 마감되면 어레이에서 "삭제"해야 합니다. 이러한 경우 배열을 "자체로" 복사하고 차원을 1로 줄이는 방법을 사용했습니다. Vasiliy Sokolov 가 제안한 것입니다. 감사합니다. 속도에 대해 생각해 본 적이 없기 때문에 이것이 가장 어려운 옵션이 아니라는 것을 알게 될 것입니다. 왜 작업이 동일한 요소를 여러 개 제거하도록 설정되었는지는 여전히 의문입니다...

ps 글을 쓰는 동안 답은 이미 나와 있습니다. 질문이 같지 않다는 것이 밝혀졌습니다 ...))))))
 
Alexey Viktorov :

mql4에서 많은 수의 오픈 포지션/오더가 있는 여러 Expert Advisors의 작업이 제공될 때, 제 생각에는 티켓이 있는 어레이를 유지하고 반복하는 대신 이 어레이를 통해 정렬하여 주문이 마감되었는지 여부를 제어하는 것이 더 쉽습니다. 기호와 마법을 확인하는 모든 열린 것들. 따라서 주문이 마감되면 어레이에서 "삭제"해야 합니다. 이러한 경우 배열을 "자체로" 복사하고 차원을 1로 줄이는 방법을 사용했습니다. 이것은 Vasiliy Sokolov 가 제안한 것입니다. 감사합니다. 속도에 대해 생각해 본 적이 없기 때문에 이것이 가장 어려운 옵션이 아니라는 것을 알게 될 것입니다. 왜 작업이 동일한 요소를 여러 개 제거하도록 설정되었는지는 여전히 의문입니다...

ps 글을 쓰는 동안 답은 이미 나와 있습니다. 질문이 같지 않다는 것이 밝혀졌습니다 ...))))))

그제서야 거의 이해했다.

주문 배열이 있으면 순서가 중요하지 않으므로 "구멍"을 배열 상단의 값으로 채우는 Kuznetsov의 변형을 사용하여 나머지 부분을 이동하지 않는 것이 더 편리 합니다. 배열 요소 . 그래서 당연히 더 빠릅니다.