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

 
Vladimir Pastushak :

Ana görev, diziyi verilen değerlerden temizlemektir.

Ana sorun bu olmayabilir. Bu dizide ne toplanır ve daha sonra nasıl kullanılır?

 
Stanislav Korotky :

Ciddi değil. Bu küçük sorunu çözmek için filleri cezbedeceksem, o zaman STL::remove(dizi, değer)'den bahsederim.

Bu sadece çok ciddi ve temel. MQL sadece ayrıntılıdır. Dehşete.

Filtre (ve TS'de vardır, filtreleme), harita (görüntüleme), katlama (konvolüsyon, toplam) gibi temel operatörler
derhal ve sorgusuz sualsiz uygulanmalıdır. Ve optimize olun.

 
Maxim Kuznetsov :

Bu sadece çok ciddi ve temel. MQL sadece ayrıntılıdır. Dehşete.

Filtre (ve TS'de vardır, filtreleme), harita (görüntüleme), katlama (konvolüsyon, toplam) gibi temel operatörler
derhal ve sorgusuz sualsiz uygulanmalıdır. Ve optimize olun.

Mesele şu ki, küçük bir görev için böylesine büyük bir ("temel") bağımlılığı çekmek saçmalıktır. Her şeyi akıllıca yazarsanız ve tüm projeyi yeniden düzenlerseniz - o zaman elbette, ancak asıl sorunun özü bu değildir.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Verilen eleman(lar)ın bir dizisini temizleme

Dmitry Fedoseev , 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);
}


Bu biraz ayıp ... ©

1. Double ile == türündeki değişkenleri karşılaştırmak, en hafif tabirle, comme il faut değil;
2. Kodun karmaşıklığı O(n^2) iken, sıralanmamış bir girdi dizisiyle verilen bir problem için en kötü karmaşıklık O(n);
3. Kod çalışmıyor, çünkü işlevin gerçek kullanımında döndürülen dizinin kaç gerçek değer içerdiğini belirlemek mümkün değildir:

 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 ;
}


Yürütme sonucu:

 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

Diziden hiçbir zaman kaldırılmayan geçersiz değerler kırmızıyla vurgulanır.

 
Sergey Dzyublik :


Bu biraz ayıp ... ©

1. Double ile == türündeki değişkenleri karşılaştırmak, en hafif tabirle, comme il faut değil;
2. Kodun karmaşıklığı O(n^2) iken, sıralanmamış bir girdi dizisiyle verilen bir problem için en kötü karmaşıklık O(n);
3. Kod çalışmıyor, çünkü işlevin gerçek kullanımında döndürülen dizinin kaç gerçek değer içerdiğini belirlemek mümkün değildir:


Yürütme sonucu:

Diziden hiçbir zaman kaldırılmayan geçersiz değerler kırmızıyla vurgulanır.

Jublik? Bırak olsun. Çift değişkenleri karşılaştırmak, karşılaştırmadan önce değerlendirilmezlerse çok kötü olur.

Malzeme öğrenin. Utançla ne alakası var?

 
Sergey Dzyublik :


Bu biraz ayıp ... ©

1. Double ile == türündeki değişkenleri karşılaştırmak, en hafif tabirle, comme il faut değil;
2. Kodun karmaşıklığı O(n^2) iken, sıralanmamış bir girdi dizisiyle verilen bir problem için en kötü karmaşıklık O(n);
3. Kod çalışmıyor, çünkü işlevin gerçek kullanımında döndürülen dizinin kaç gerçek değer içerdiğini belirlemek mümkün değildir:


Yürütme sonucu:

Diziden hiçbir zaman kaldırılmayan geçersiz değerler kırmızıyla vurgulanır.

Saçma sapan konuşma. Size hatanızı açıklayın veya kendinizi tahmin edin? hiç de zor değil...

Üç puan - üç padok. Hayır, sadece iki padok olmasına rağmen.

ps ama sana inanıyorum

ps2, işlevi doğru kullanırsanız sonuç budur:


 

Bu daha iyi:

 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 :

Bu daha iyi:

Dmitry, üzgün - v - ayrıca bir dizi.

Ve genel olarak, tüm bunlar tamamen saçmalık.

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

Dmitry, üzgün - v - ayrıca bir dizi.

Ve genel olarak, tüm bunlar tamamen saçmalık.

v bir diziyse, bu bir sorun değil. Ve saçma olduğu gerçeği - oldukça evet. Bu sorunu çözme ihtiyacı hiç duymadım.

 

Pekala, hız açısından böyle bir içki yarışması çoktan gittiyse, o zaman kendi versiyonumu sunacağım:

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

Tüm seçenekler için bir test komut dosyası yazdı.
1.000.000 elemanlı bir dizi için sonuç (yaklaşık 1000 ekstra değer):

 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 микросекунд
Sıradaki kim? :))
Peter, vay...
Dosyalar: