Verilen eleman(lar)ın bir dizisini temizleme - sayfa 10

 

Bir TK için 2 kod seçeneğini karşılaştırın:

 //+------------------------------------------------------------------+
//|                                             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);
   //--------------------------------  
  }
//+------------------------------------------------------------------+

ve:

 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);
Bir kişi bunu bir saatten biraz fazla aralıklarla yazmış olabilir mi? El yazısı şüpheli
 
Maxim Kuznetsov :

Alexey, gerçekten genç yetenekleri öldürüyorsun ...

bu pazarlamacı 5 yıl satış yapamaz

Üzgünüm, öyle demek istemedim.

 
Maxim Kuznetsov :

:-) sırayı korumaya çalışmazsanız, zaman O(1) , tüm döngülerin toplam adım sayısı = dizi boyutu

kodlamak için çok tembel :-)

1. Soldan sağa ilk 3-ku'yu arıyoruz.

2. Bulunursa, o zaman sağdan sola üç olmayanı arıyoruz., bulunanı 3'ün yerine kopyalayın.

1,2 kesişene kadar devam edin, diziyi kopya sayısına göre kesin.

ideolojik olarak, bu tam olarak "kabarcık sıralama" nın 1/2'sidir :-) kopyalamak yerine takas yaparsanız, çıktı kısmen sıralı bir dizidir (tüm 3'ler sağa taşınır)

Tüm döngülerin toplam adım sayısı = dizi boyutu O(n) karmaşıklığıdır.
Girdi dizisi sıralanırsa, sorun ikili arama yoluyla çözülür.
Karmaşıklık ortalama olarak O(log(n)) ve en kötü durumlarda O(n)'dir.

 
Kod yazamayacak kadar tembel olmanız kötüdür.
 
Nikolai Semko :

Yine de, Peter'ın seçeneğinde ustalaştı.

oldukça kompakt ve hatta düzgün çalışıyor. Peter'a saygılar.
Ancak hız açısından sondan ikinci sırada yer alıyor. Veya sondan ilk yer, bu şubenin sahibinin orijinal versiyonu hariç, hız için tamamen uygun değil.

Nasıl test ettin?

 
Son attığı bir seçenek değil. Herhangi birine baskın yapmak gerekir.
 
Реter Konow :

Nasıl test ettin?

Kodu öğrenin.

 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 микросекунд
Dosyalar:
 
Алексей Тарабанов :
Kod yazamayacak kadar tembel olmanız kötüdür.

tamamen tembel olduğundan değil, ancak MT yalnızca VDS'lerde elinizin altında, ancak bunlar üzerinde deney yapmıyorlar.

aşağı yukarı şöyle:

 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 :-) Birkaç gün içinde kulübeden döneceğim, kontrol edeceğim ..

not. ayrıca, kodda tamamlandıktan sonra döngüye fazladan bir giriş var .. bir önemsememek, ancak kaldırabilirsiniz

 
Maxim Kuznetsov :

tamamen tembel olduğundan değil, ancak MT yalnızca VDS'lerde elinizin altında, ancak bunlar üzerinde deney yapmıyorlar.

aşağı yukarı şöyle:

+- 1 :-) Birkaç gün içinde kulübeden döneceğim, kontrol edeceğim ..

not. ayrıca, kodda tamamlandıktan sonra döngüye fazladan bir giriş var .. bir önemsememek, ancak kaldırabilirsiniz

Bravo! Birkaç hatayı düzelttikten sonra, ArrayCopy kullanmadan bile beni kaidemden attınız . Şah Mat. :))

 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 микросекунд
Dosyalar:
 
Nikolai Semko :

Bravo! Birkaç hatayı düzelttikten sonra ArrayCopy kullanmadan bile beni kaidemden attınız. Şah Mat. :))

Gerçek pek öyle değil çünkü. çıktıda, dizi tamamen farklıdır - zaten karıştırılmıştır. Ama yine de havalı!

Alıntılarla uğraşıyorsak, bu seçenek elbette uygun değildir. Kaideye geri döndüm. ))

Sağlama toplamının hesaplanma şeklini değiştirdim. Artık tüm öğelerin basit bir toplamı değil, toplam - (eleman değeri) / (eleman numarası).
Ve işte olanlar:

 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 микросекунд
Dosyalar: