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

Vladimir Pastushak :

주요 작업은 주어진 값에서 배열을 지우는 것입니다.

이것은 주요 문제가 아닐 수 있습니다. 이 어레이에서 수집된 것은 무엇이며 어떻게 사용됩니까?

Stanislav Korotky :

글쎄, 심각하지 않습니다. 이 작은 문제를 해결하기 위해 코끼리를 끌어들이려면 STL::remove(array, value)를 언급하겠습니다.

이것은 매우 심각하고 근본적인 것입니다. MQL은 장황합니다. 공포에.

필터 (TS에는 필터링), 맵 (디스플레이), 접기 (컨볼루션, 합계)와 같은 기본 연산자
의문의 여지 없이 즉시 구현되어야 합니다. 그리고 최적화하십시오.

Maxim Kuznetsov :

이것은 매우 심각하고 근본적인 것입니다. MQL은 장황합니다. 공포에.

필터 (TS에는 필터링), 맵 (디스플레이), 접기 (컨볼루션, 합계)와 같은 기본 연산자
의문의 여지 없이 즉시 구현되어야 합니다. 그리고 최적화하십시오.

요점은 작은 작업에 대해 그러한 지방("기본") 의존성을 끌어내는 것은 넌센스라는 것입니다. 모든 것을 똑똑한 방법으로 작성하고 전체 프로젝트 를 리팩터링하면 물론이지만 이것이 원래 질문의 본질이 아닙니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

주어진 요소의 배열 지우기

드미트리 페도세프 , 2018.11.12 23:05

 void DelEl( double & a[], double v){
   int sz= ArraySize (a);
   for ( int i=sz- 1 ;i>= 0 ;i--){
       if (a[i]==v){
         sz--;
         for ( int j=i;j<sz;j++){
            a[j]=a[j +1 ];
         }
      }
   }
   ArrayResize (a,sz);
}


이것은 일종의 수치입니다 ... ©

1. 이중 유형의 변수를 ==를 통해 비교하려면 comme il faut가 아니라 온화하게 표현합니다.
2. 코드의 복잡성은 O(n^2)인 반면 정렬되지 않은 입력 시퀀스가 있는 주어진 문제에 대한 최악의 복잡성은 O(n)이어야 합니다.
3. 함수의 실제 사용에서는 반환된 배열에 포함된 실제 값의 수를 결정할 수 없기 때문에 코드가 작동하지 않습니다.

 void DelEl( double & a[], double v){
   int sz= ArraySize (a);
   for ( int i=sz- 1 ;i>= 0 ;i--){
       if (a[i]==v){
         sz--;
         for ( int j=i;j<sz;j++){
            a[j]=a[j+ 1 ];
         }
      }
   }
   ArrayResize (a,sz);
}


int OnStart (){
   double arr[] = { 3 , 5 , 5 , 3 , 3 , 5 , 5 , 3 };
   double v = 3 ;
   
   ArrayPrint (arr);
   DelEl(arr, v);
   ArrayPrint (arr);
   
   return INIT_SUCCEEDED ;
}


실행 결과:

 2018.11 . 13 00 : 35 : 33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11 . 13 00 : 37 : 08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

잘못된 값은 배열에서 제거되지 않은 빨간색으로 강조 표시됩니다.

Sergey Dzyublik :


이것은 일종의 수치입니다 ... ©

1. 이중 유형의 변수를 ==를 통해 비교하려면 comme il faut가 아니라 온화하게 표현합니다.
2. 코드의 복잡성은 O(n^2)인 반면 정렬되지 않은 입력 시퀀스가 있는 주어진 문제에 대한 최악의 복잡성은 O(n)이어야 합니다.
3. 함수의 실제 사용에서는 반환된 배열에 포함된 실제 값의 수를 결정할 수 없기 때문에 코드가 작동하지 않습니다.


실행 결과:

잘못된 값은 배열에서 제거되지 않은 빨간색으로 강조 표시됩니다.

주블릭? 순리에 맡기다. 이중 변수를 비교하는 것은 비교 전에 평가되지 않는 경우 매우 중요합니다.

재료를 배우십시오. 부끄러움이 무엇입니까?

Sergey Dzyublik :


이것은 일종의 수치입니다 ... ©

1. 이중 유형의 변수를 ==를 통해 비교하려면 comme il faut가 아니라 온화하게 표현합니다.
2. 코드의 복잡성은 O(n^2)인 반면 정렬되지 않은 입력 시퀀스가 있는 주어진 문제에 대한 최악의 복잡성은 O(n)이어야 합니다.
3. 함수의 실제 사용에서는 반환된 배열에 포함된 실제 값의 수를 결정할 수 없기 때문에 코드가 작동하지 않습니다.


실행 결과:

잘못된 값은 배열에서 제거되지 않은 빨간색으로 강조 표시됩니다.

말도 안되는 소리 하지 마세요. 당신의 실수를 설명하거나 스스로 추측합니까? 전혀 어렵지 않아요...

3점 - 3개의 목장. 하지만, 아니요, 단지 두 개의 목장.

ps 하지만 난 당신을 믿습니다

ps2 함수를 올바르게 사용하면 다음과 같은 결과가 나타납니다.


그게 낫다:

 void DelEl2( double & a[], double v){
   int sz= ArraySize (a);
   int i= 0 ;   
   int j= 0 ;
   for (;i<sz;i++){ 
       if (a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize (a,j);
}
Dmitry Fedoseev :

그게 낫다:

Dmitry, 화가 - v - 또한 배열입니다.

그리고 일반적으로 이 모든 것은 완전히 넌센스입니다.

Алексей Тарабанов :

Dmitry, 화가 - v - 또한 배열입니다.

그리고 일반적으로 이 모든 것은 완전히 넌센스입니다.

v가 배열이면 문제가 되지 않습니다. 그리고 그것이 넌센스라는 사실 - 오히려 그렇습니다. 이 문제를 해결할 필요가 없었습니다.

글쎄, 속도면에서 그러한 술 경쟁이 이미 갔다면 나는 내 자신의 버전을 제공 할 것입니다.

 int ArrayDeleteVal( int &a[], const int val) // вариант Semko
  {
   int size= ArraySize (a);
   int i= 0 ,start,s,count;
   while (i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   s=i; i++;
   while ( true )
     {
       while (i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
       if (count> 6 ) { ArrayCopy (a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
       else for (; s<i; start++,s++) a[start]=a[s];                 // иначе простой цикл
       if (i==size) break ;
      i++;
       while (i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
       if (i<size) s=i; else break ;
      i++;
     }
   if (start<size) ArrayResize (a,start); else start=size;
   return (start);
  }

모든 옵션에 대한 테스트 스크립트를 작성했습니다.
다음은 1,000,000개 요소(약 1000개 추가 값)의 배열에 대한 결과입니다.

 2018.11 . 12 19 : 50 : 02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091 ; элементов - 998983 ; время выполнения = 156457 микросекунд
2018.11 . 12 19 : 50 : 02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091 ; элементов - 998983 ; время выполнения = 2319 микросекунд
2018.11 . 12 19 : 50 : 02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091 ; элементов - 998983 ; время выполнения = 1810 микросекунд
2018.11 . 12 19 : 50 : 02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091 ; элементов - 998983 ; время выполнения = 785 микросекунд
다음은 누구입니까? :))
피터, 와...
파일: