주어진 요소의 배열 지우기 - 페이지 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 микросекунд
다음은 누구입니까? :))
피터, 와...
파일: