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

 

İşte ikili aramayı kullanan daha iyi bir sürüm.

 #include <Arrays\ArrayInt.mqh>
int array_filter( int &arr[], const int &filters[])
{
   int size_arr = ArraySize (arr);
   CArrayInt filterz;
   filterz.AssignArray(filters);
   filterz.Sort();
   int i= 0 , k= 0 ;
   for (i= 0 ; i<size_arr; i++)
       if (filterz.Search(arr[i]) < 0 )
         arr[k++] = arr[i]; 
   return ArrayResize (arr, k); 
}


 Rusça bilmiyorum, google translate kullanıyorum.
 
jdjahfkahjf :

Rus değil, anlamak zor. El habla espanol.

O yerlerden geçerken İspanyolca öğrenmek beni cezbetti ama nedense bıraktım.. nafile..
 
template < typename T>
int arrayFilter(T &data[], const T value)
{
     bool ser = ArrayGetAsSeries ( data ) ? ArraySetAsSeries (data, false ) : false ;
   
     int s, _s = s = ArraySize (data);
     bool result = false ;
     
     for ( int i= 0 , j= 0 ; i<_s && ! IsStopped (); i++)
     {
           if ( data[i] == value || data[i] == NULL )
          {
               result = true ;
               s--;
               continue ;
          }
          
           if ( result )
               data[j] = data[i];
          j++;
     }
     
     if (s < _s)
           if ( ArrayResize (data, s) )
               if ( ArraySize (data) == _s)
                     ArrayFill (data, s, _s-s, NULL );
     
     if ( ser )
           ArraySetAsSeries (data, true );
     
     return s;
}

template < typename T>
int arrayFilter(T &data[], const T &value[])
{
     bool ser = ArrayGetAsSeries ( data ) ? ArraySetAsSeries (data, false ) : false ;
   
     int s, _s = s = ArraySize (data);
     bool result = false ;
     
     for ( int i= 0 , j= 0 ; i<_s && ! IsStopped (); i++)
     {
          bool p = false ;
           for ( int y= 0 ; y< ArraySize (value); y++)
               if ( data[i] == value[y] )
               {
                    result = true ;
                    s--;
                    p = true ;
                     break ;
               }
           if ( p )
               continue ;
          
           if ( result )
               data[j] = data[i];
          j++;
     }
     
     if (s < _s)
           if ( ArrayResize (data, s) )
               if ( ArraySize (data) == _s)
                     ArrayFill (data, s, _s-s, NULL );
     
     if ( ser )
           ArraySetAsSeries (data, true );
     
     return s;
}

İhtiyacınız kadar ve sonunda arayabilirsiniz.

 
Konstantin Nikitin :

İhtiyacınız kadar ve sonunda arayabilirsiniz.

işleve girerken sıralanacak değerin kopyası[] ve

ikili arama ile her şey daha hızlı olacak, burada İspanyol haklı.

 
Maxim Kuznetsov :

işleve girerken sıralanacak değerin kopyası[] ve

ikili arama ile her şey daha hızlı olacak, burada İspanyol haklı.

Evet, kafamla uğraşmadım. Hızlıca hareket etti. Evet ve dize dizileri olabilir.

PS Bu eğlenceden bıktınız. meşgul olma zamanı
 
Maxim Kuznetsov :

işleve girerken sıralanacak değerin kopyası[] ve

ikili arama ile her şey daha hızlı olacak, burada İspanyol haklı.

değer değerleri için HashSet veri yapısını kullanırdım.
Karmaşıklık şöyle olacaktır: O(n) + O(m)

Önerilen ikili arama için karmaşıklık şöyle olacaktır: O(n log(m))

 

24 sayfa - mizacın nereden geldiği ve ilkel bir görevi ne kadar öğütebileceğiniz belli değil, senaryoyu üçüncü sayfadan aldım çünkü Daha fazla okuyacak gücüm yok, üç satır ekledim, satır içi işlevsiz.

N= ArraySize (arr)- 1 ;
for ( int i=N;i>= 0 ;i--) if (arr[i]==Value) arr[i]=arr[N--]; N++;
ArrayResize (arr,N);
2018.11 . 17 01 : 44 : 40.077 ArrayDeleteValue (EURUSD,H1)    вариант Pastushak: Контрольная сумма = 496597320 ; элементов - 999020 ; время выполнения = 308973 микросекунд
2018.11 . 17 01 : 44 : 40.092 ArrayDeleteValue (EURUSD,H1)    вариант Korotky: Контрольная сумма = 496597320 ; элементов - 999020 ; время выполнения = 11531 микросекунд
2018.11 . 17 01 : 44 : 40.107 ArrayDeleteValue (EURUSD,H1)    вариант Fedoseev: Контрольная сумма = 496597320 ; элементов - 999020 ; время выполнения = 11325 микросекунд
2018.11 . 17 01 : 44 : 40.114 ArrayDeleteValue (EURUSD,H1)    вариант Semko: Контрольная сумма = 496597320 ; элементов - 999020 ; время выполнения = 2819 микросекунд
2018.11 . 17 01 : 44 : 40.117 ArrayDeleteValue (EURUSD,H1)    вариант Inline: Контрольная сумма = 496597320 ; элементов - 999020 ; время выполнения = 2600 микросекунд

garip, ama kampanya herkesi yendi - "beş dakika içinde ve herhangi bir numara olmadan" (c) ve yatağa gitti ...)))

Dosyalar:
 
Ivan Negreshniy :

24 sayfa - mizacın nereden geldiği ve ilkel bir görevi ne kadar öğütebileceğiniz belli değil, senaryoyu üçüncü sayfadan aldım çünkü Daha fazla okuyacak gücüm yok, üç satır ekledim, satır içi işlevsiz.

garip, ama kampanya herkesi yendi - "beş dakika içinde ve herhangi bir numara olmadan" (c) ve yatağa gitti ...)))

1. Kaç yaşında olduğu belli olmayan kodu aldınız ve bu, topluluğa doğrudan bir saygısızlıktır;
2. Kodda, nagamnokodiv'de bir yerde, ayrı bir işleve bile taşımadan değişiklikler yaptık;
3. Sonra, görünüşe göre, hem yürütme hızı hem de sonuçlar RELEASE sürümüne karşılık gelmediğinden, DEBUG derlemesinde performans testi için kodu başlattılar.
4. Aynı zamanda kodunuz hatalar içeriyor ve sorunu hiç çözmüyor. (Çünkü arr[N--] , filtrelenmemiş veya kaldırılmamış bir Değer içerebilir.)

Ama böyle bir "kazanan"dan gelen pathos ...

 

TAMAM. İş yokken delilik testi devam ediyor. Yeni bir vektör testi eklendi ve aynı zamanda @Ivan Negreshniy seçeneği eklendi., bak, hatalarını analiz et, algoritman çalışmıyor.

Böyle çıktı

1

Dosyalar:
 

Küçük optimizasyon

PS hataları düzeltti ve dosyayı değiştirdi

Dosyalar:
Neden: