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

 
Nikolai Semko :

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

Değiştirmeye değer olabilir
 for (;;)

üzerinde

 while ( true )

Neyse aradan çıkış

PS İlgi uğruna, tüm dizi üzerinde doğrudan kopyalamayı çalıştırdım.
 template < typename T>
int arrayFilter(T &data[], const T value)
  {
     int s, _s = s = ArraySize (data);
     bool result = false ;
     
     for ( int i= 0 , j= 0 ; i<_s; i++)
     {
           if ( data[i] == value )
          {
               result = true ;
               s--;
               continue ;
          }
           if ( result )
               data[j] = data[i];
          j++;
     }
     
     if (s < _s)
           ArrayResize (data, s);
     
     return s;
  }
 
Konstantin Nikitin :
Değiştirmeye değer olabilir

üzerinde

Neyse aradan çıkış

Fark yok. Sonsuz döngülerden daha fazlasını seviyorum çünkü. daha kısa ve gerçek yeni başlayanların kafasını karıştırmaz.
 
MT5 / ME optimizer geliştiricilerinin bahçesinde bir taş (1945 yapımı).
terminal Windows 10 (derleme 17134) x64, IE 11, UAC, Intel Core i7-7700HQ @ 2.80GHz, Bellek: 5276 / 16250 Mb


Neden kod:
arr[j++] = arr[i];

Şundan daha yavaş çalışır:
arr[j] = arr[i];
j++;



Bu yarışmaya kuralsız katılırsak, "lider" kodunu (şu anda Kuznetsov'dur) kopyalarız ve yukarıda açıklanan sistem davranışına göre değiştiririz.
İlk 740 ms'lik yürütme süresinden yaklaşık 20 ms'lik sabit bir kazanç elde ediyoruz:

 template < typename T>
int arrayFilter_ALXIMIKS(T &arr[], const T x)   // вариант ALXIMIKS
{
         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];
                        i++;
                        j--;
                } else break ;
        }
         ArrayResize (arr,j);
         return j;
}
 

Bu arada orjinal dizi dizi gibi olursa sonuçların nasıl değişeceği merak ediliyor. ArraySetAsSeries (dizi,doğru)

 
Sergey Dzyublik :
Bu yarışmaya kuralsız katılırsak, "lider" kodunu (şu anda Kuznetsov'dur) kopyalarız ve yukarıda açıklanan sistem davranışına göre değiştiririz.

İlk 740 ms'lik yürütme süresinden yaklaşık 20 ms'lik sabit bir kazanç elde ediyoruz:

Eklemeye değer. Dizi elemanlarının sırası önemli değilse. Evet, harika bir seçenek. Tutarlılık önemliyse, başka bir şeye ihtiyaç vardır.

 

Böyle bir içki gittiğine göre, işte benim versiyonum:

 int SokolovDelRetry( int &array[], const int val)
{
   int total = ArraySize(array);
   int in = - 1 , count = 0 , diff = 0 ;
   for ( int i = 0 ; i < total; i++)
   {
      diff++;
       if (array[i] == val)
      {
         diff--;
         if ( in != - 1 )
         {
             if (diff> 0 )
            {
               ArrayCopy(array, array, in , i-diff, diff);
               in = in + diff;
               diff = 0 ;
            }
            count++;
         }
         else
         {
             in = i;
            diff = 0 ;
            count++;
         }
      }
   }
   if (diff > 0 )
      ArrayCopy(array, array, in , total - diff, diff);
   ArrayResize(array, total - count);
   return total - count;
}

Sonuçlar:

 2018.11 . 14 16 : 20 : 15.293 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pastushak: Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 89383 микросекунд
2018.11 . 14 16 : 20 : 15.313 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Korotky:   Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 18148 микросекунд
2018.11 . 14 16 : 20 : 15.337 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Fedoseev:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 15637 микросекунд
2018.11 . 14 16 : 20 : 15.347 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Semko:     Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 4626 микросекунд
2018.11 . 14 16 : 20 : 15.367 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pavlov:    Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 16976 микросекунд
2018.11 . 14 16 : 20 : 15.407 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Nikitin:   Контрольная сумма = 495345526 ; элементов - 997945 ; время выполнения = 27381 микросекунд
2018.11 . 14 16 : 20 : 15.427 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Vladimir:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 16178 микросекунд
2018.11 . 14 16 : 20 : 15.457 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Peter:     Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 19618 микросекунд
2018.11 . 14 16 : 20 : 15.477 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Sokolov:  Контрольная сумма = 495345526 ; элементов - 998956 ; время выполнения = 11058 микросекунд

Z.s. Prensip olarak, hız sınırına ulaşıldı. Ayrıca, yalnızca for döngüsüyle mikro optimizasyonlar ve şamanizm:

Bence Nikolay'ın sonucu, bu tür mikro optimizasyonların ustaca kullanılmasıdır.

Dosyalar:
 
Vladimir Pastushak :

1,2,3,6,9,5,6,3,25,6,8,7,4 türünde bir veri kümesi içeren bir dizi var, örneğin 3'ün değerleri olmalıdır silindi ve çıktı 3 ve boş boşluklar olmadan aynı dizi olacak. ..

Bir dizi önemsiz değeri temizlemenin en hızlı yolunu arıyorum ...

aklıma bir örnek geliyor

Daha ucuz ve daha hızlı bir yolu var mı?

Vladimir, bu neden gerekli?
Anladığım kadarıyla, bu gösterge tamponu ile yapılmalıdır. Ama o zaman boş ve (veya) "ekstra" değerleri bir önceki değerle veya örneğin uç değerlerin aritmetik ortalaması ile değiştirmek daha mantıklı değil mi? Daha sonra çok daha hızlı gerçekleştirilecek ve dizi boyutu aynı kalacaktır.

 
Nikolai Semko :

Vladimir, bu neden gerekli?
Anladığım kadarıyla, bu gösterge tamponu ile yapılmalıdır. Ama o zaman boş ve (veya) "ekstra" değerleri bir önceki değerle veya örneğin uç değerlerin aritmetik ortalaması ile değiştirmek daha mantıklı değil mi? Daha sonra çok daha hızlı gerçekleştirilecek ve dizi boyutu aynı kalacaktır.

Bu, bilgileri, büyük miktarda bilgiyi görüntülemek ve buna dayanarak daha fazla hesaplama yapmak için gereklidir. Alakasız veri dizisini temizlemek için bu tür bir işleve ihtiyaç vardır. Ve en önemlisi, çok hızlı çalışması gerekir! Analogum hızdaki herkesten daha düşük, bu bilgi görüntülerken frizlere neden oluyor.

 
Nikolai Semko :

Vladimir, bu neden gerekli?
Anladığım kadarıyla, bu gösterge tamponu ile yapılmalıdır. Ama o zaman boş ve (veya) "ekstra" değerleri bir önceki değerle veya örneğin uç değerlerin aritmetik ortalaması ile değiştirmek daha mantıklı değil mi? Daha sonra çok daha hızlı gerçekleştirilecek ve dizi boyutu aynı kalacaktır.

Birden fazla Uzman Danışmanın mql4'te çok sayıda açık pozisyon / emir ile çalışması sağlandığında, yineleme yapmak yerine biletlerle bir dizi tutmak ve siparişin kapanıp kapanmadığını kontrol etmek bence daha kolay. sembolü ve sihri kontrol ederek hepsi açık. Bu nedenle, sipariş kapatılırsa, diziden "silinmesi" gerekir. Bu gibi durumlarda, diziyi "kendisine" kopyalayıp boyutu birer birer küçültmeyi kullandım. Hangi Vasiliy Sokolov tarafından önerildi, bunun için çok teşekkürler, bunun en zor seçenek olmadığını bileceğim, çünkü hızı hiç düşünmedim. Görevin neden birkaç eşit öğeyi kaldırmak için ayarlandığı hala soru...

ps Ben yazarken, cevap zaten orada. Sorunun aynı olmadığı ortaya çıktı ...))))))
 
Alexey Viktorov :

Birden fazla Uzman Danışmanın mql4'te çok sayıda açık pozisyon / emir ile çalışması sağlandığında, yineleme yapmak yerine biletlerle bir dizi tutmak ve siparişin kapanıp kapanmadığını kontrol etmek bence daha kolay. sembolü ve sihri kontrol ederek tüm açık olanları. Bu nedenle, sipariş kapatılırsa, diziden "silinmesi" gerekir. Bu gibi durumlarda, diziyi "kendisine" kopyalayıp boyutu birer birer küçültmeyi kullandım. Hangi Vasiliy Sokolov tarafından önerildi, bunun için çok teşekkürler, bunun en zor seçenek olmadığını bileceğim, çünkü hızı hiç düşünmedim. Görevin neden birkaç eşit öğeyi kaldırmak için ayarlandığı hala soru...

ps Ben yazarken, cevap zaten orada. Sorunun aynı olmadığı ortaya çıktı ...))))))

sonra neredeyse anladım.

bir dizi sipariş varsa, sıra önemli değildir, bu nedenle Kuznetsov'un varyantını "delikleri" dizinin üst kısmındaki değerlerle doldurarak kullanmak, geri kalanını hareket ettirmemek için daha uygundur . dizi öğeleri . Yani tabii ki daha hızlı.

Neden: