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

 

하나의 TK에 대해 2개의 코드 옵션을 비교합니다.

 //+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int Arr[ 20 ] = { 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 };
   ulong q1 = GetMicrosecondCount (); 
   //--------------------------------
   int deleted = 0 ,q = 0 ;
   //-------------- 
   for ( int a1 = 0 ; a1 < ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q] = Arr[q + deleted];
       if (Arr[q] == 3 ){deleted++; q--;}
      q++;
     }
   //--------------
   ulong q2 = GetMicrosecondCount (); 
   //--------------------------------
   //ArrayResize(Arr, ArraySize(Arr) - deleted);    
   //--------------------------------
   Print (Arr[ 0 ], "," ,Arr[ 1 ], "," ,Arr[ 2 ], "," ,Arr[ 3 ], "," ,Arr[ 4 ], "," ,Arr[ 5 ], "," ,Arr[ 6 ], "," ,Arr[ 7 ], "," ,Arr[ 8 ], "," ,Arr[ 9 ],
         "," ,Arr[ 10 ], "," ,Arr[ 11 ], "," ,Arr[ 12 ], "," ,Arr[ 13 ], "," ,Arr[ 14 ], "," ,Arr[ 15 ], "," ,Arr[ 16 ], "," ,Arr[ 17 ], "," ,Arr[ 18 ], "," ,Arr[ 19 ]);
   Print ( "Array new size  " , ArraySize (Arr), "  Тime of operation  " ,q2-q1, "  deleted  " ,deleted);
   //--------------------------------  
  }
//+------------------------------------------------------------------+

그리고:

 int Arr[ 20 ] = { 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 };
int deleted;
//-------------- 
for ( int a1 = 0 ; a1 < ArraySize (Arr); a1++)
  {
   if (Arr[a1] == 3 )
     {
       if (deleted)a1-= deleted; //Cмещение назад.
      deleted++; 
     }
   if (deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize (Arr, ArraySize (Arr) - deleted);
한 사람이 한 시간이 조금 넘는 간격으로 이것을 쓸 수 있었을까요? 손글씨가 의심스럽다
 
Maxim Kuznetsov :

Alexey, 당신은 정말로 젊은 인재를 죽이고 있습니다 ...

이 마케터는 5년 동안 판매를 시작할 수 없습니다. 그리고 당신은 프로그래머로서 그가 더 나쁘다고 말합니다.

죄송합니다. 의도하지 않았습니다.

 
Maxim Kuznetsov :

:-) 순서를 지키려고 하지 않으면 시간은 O(1) , 모든 루프의 총 단계 수 = 배열 크기

너무 게으른 코딩 :-)

1. 왼쪽에서 오른쪽으로 첫 번째 3구를 찾고 있습니다.

2. 발견되면 오른쪽에서 왼쪽으로 3이 아닌 항목을 찾습니다. 발견된 항목을 3의 위치에 복사합니다.

1,2가 교차할 때까지 계속하고 복사본 수만큼 배열을 자릅니다.

이념적으로 이것은 "거품 정렬"의 정확히 1/2입니다 :-) 복사하는 대신 스왑을 수행하면 출력이 부분적으로 정렬된 배열이 됩니다(3개 모두 오른쪽으로 이동됨)

모든 루프의 총 단계 수 = 배열 크기는 O(n) 복잡도입니다.
입력 배열이 정렬되면 이진 검색 을 통해 문제가 해결됩니다.
복잡도는 평균 O(log(n))이고 최악의 경우 O(n)입니다.

 
코딩하기에 너무 게으르면 좋지 않습니다.
 
Nikolai Semko :

그럼에도 불구하고 그는 Peter의 옵션을 마스터했습니다.

아주 컴팩트하고 제대로 작동합니다. 피터에게 경의를 표합니다.
그러나 속도면에서는 끝에서 두 번째입니다. 또는이 지점 소유자의 원래 버전을 제외하고 속도에 완전히 부적합한 끝에서 첫 번째 장소.

테스트는 어떻게 하셨나요?

 
그가 던진 옵션이 아니라 마지막. 무엇이든 버스트해야합니다.
 
Реter Konow :

테스트는 어떻게 하셨나요?

코드를 배우십시오.

 2018.11 . 14 03 : 26 : 49.182 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 131158 микросекунд
2018.11 . 14 03 : 26 : 49.185 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 2431 микросекунд
2018.11 . 14 03 : 26 : 49.188 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 1809 микросекунд
2018.11 . 14 03 : 26 : 49.190 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 785 микросекунд
2018.11 . 14 03 : 26 : 49.194 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 2839 микросекунд
2018.11 . 14 03 : 26 : 49.199 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 496575839 ; элементов - 997971 ; время выполнения = 4049 микросекунд
2018.11 . 14 03 : 26 : 49.204 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 3888 микросекунд
2018.11 . 14 03 : 26 : 49.212 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 496575839 ; элементов - 998974 ; время выполнения = 7597 микросекунд
파일:
 
Алексей Тарабанов :
코딩하기에 너무 게으르면 좋지 않습니다.

완전히 게으른 것은 아니지만 MT는 VDS에서만 사용할 수 있지만 실험하지는 않습니다.

다음과 같이 다소:

 template < typename T>
int arrayFilter( const   T &arr[], const T x)
{
         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--];
                } else break ;
        }
         ArrayResize (j+ 1 );
         return j+ 1 ;
}

+- 1 :-) 며칠내로 다차에서 돌아와서 확인해볼께요..

추신. 게다가 코드에는 완료 시 루프에 대한 추가 항목이 있습니다. .. 사소한 일이지만 제거할 수 있습니다.

 
Maxim Kuznetsov :

완전히 게으른 것은 아니지만 MT는 VDS에서만 사용할 수 있지만 실험하지는 않습니다.

다음과 같이 다소:

+- 1 :-) 며칠내로 다차에서 돌아오겠습니다 확인하겠습니다..

추신. 게다가 코드에는 완료 시 루프에 대한 추가 항목이 있습니다. .. 사소한 일이지만 제거할 수 있습니다.

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

 template < typename T>
int arrayFilter3(T &arr[], const T x)   // вариан Kuznetsov
{
         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--];
                } else break ;
        }
         ArrayResize (arr,j+ 1 );
         return j+ 1 ;
}
 2018.11 . 14 03 : 48 : 29.572 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 131929 микросекунд
2018.11 . 14 03 : 48 : 29.576 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 2411 микросекунд
2018.11 . 14 03 : 48 : 29.579 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 1839 микросекунд
2018.11 . 14 03 : 48 : 29.581 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 782 микросекунд
2018.11 . 14 03 : 48 : 29.585 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 2813 микросекунд
2018.11 . 14 03 : 48 : 29.590 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 496206996 ; элементов - 997969 ; время выполнения = 4200 микросекунд
2018.11 . 14 03 : 48 : 29.596 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 3597 микросекунд
2018.11 . 14 03 : 48 : 29.604 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 7684 микросекунд
2018.11 . 14 03 : 48 : 29.606 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 496206996 ; элементов - 999002 ; время выполнения = 681 микросекунд
파일:
 
Nikolai Semko :

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

진실은 그렇지 않기 때문입니다. 출력에서 배열은 완전히 다릅니다. 이미 혼합되어 있습니다. 하지만 여전히 멋지다!

따옴표를 다루는 경우 물론이 옵션은 적합하지 않습니다. 나는 받침대로 돌아왔다. ))

체크섬 계산 방식을 변경했습니다. 더 이상 모든 요소의 단순 합이 아니라 합계 - (요소 값) / (요소 번호)입니다.
그리고 일어난 일은 다음과 같습니다.

 2018.11 . 14 04 : 20 : 26.063 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 132291 микросекунд
2018.11 . 14 04 : 20 : 26.067 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 2322 микросекунд
2018.11 . 14 04 : 20 : 26.071 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 1831 микросекунд
2018.11 . 14 04 : 20 : 26.074 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 773 микросекунд
2018.11 . 14 04 : 20 : 26.079 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 2879 микросекунд
2018.11 . 14 04 : 20 : 26.085 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 7093.903216084301 ; элементов - 998017 ; время выполнения = 3605 микросекунд
2018.11 . 14 04 : 20 : 26.090 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 3622 микросекунд
2018.11 . 14 04 : 20 : 26.100 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 7090.600736767353 ; элементов - 999003 ; время выполнения = 7252 микросекунд
2018.11 . 14 04 : 20 : 26.102 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 7085.49357433088 ;   элементов - 999003 ; время выполнения = 691 микросекунд
파일: