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

 
Alexey Viktorov :

Bu nedenle, sipariş kapatılırsa, diziden "silinmesi" gerekir. Bu gibi durumlarda, diziyi "kendisine" kopyalayıp boyutu birer birer küçültmeyi kullandım.

Bu durumda -1 dizisine var olmayan bir bilet yazdım ve tüm siparişlerin kapanmasını bekledim ve tüm diziyi sildim (Dizi boyutunu =1 olarak ayarladım).

Bu yaklaşımla , bilet dizisinin bir öğesi ( sipariş yoksa) yalnızca bir koşulla kontrol edilir: if(ArrayOfTicket[i] > 0) .....

IMHO, diziyi sürekli olarak "sallamaktan" çok daha hızlı

 
Igor Makanu :

Bu durumda -1 dizisine var olmayan bir bilet yazdım ve tüm siparişlerin kapanmasını bekledim ve tüm diziyi sildim (Dizi boyutunu =1 olarak ayarladım).

Bu yaklaşımla , bilet dizisinin bir öğesi ( sipariş yoksa) yalnızca bir koşulla kontrol edilir: if(ArrayOfTicket[i] > 0) .....

IMHO, diziyi sürekli olarak "sallamaktan" çok daha hızlı

Hiçbir şey anlamadım... Ve ne fark eder ki, eleman eleman silmek ya da var olmayan siparişlerin indekslerini kontrol etmek... dizi yine de bozuluyor...

Genel olarak bugün haberlerde dedikleri gibi lezzetin patentini almak mümkün değil. Keçeli kalemler sadece renk olarak farklıdır, ancak hepsinin tadı aynıdır.

 
Alexey Viktorov :

Hiçbir şey anlamadım... Ve ne fark eder ki, eleman eleman silmek ya da var olmayan siparişlerin indekslerini kontrol etmek... dizi yine de bozuluyor...

Genel olarak bugün haberlerde dedikleri gibi lezzetin patentini almak mümkün değil. Keçeli kalemler sadece renk olarak farklıdır, ancak hepsinin tadı aynıdır.

bir öğeyi silmek, dizinin kalan öğelerini kopyalamak anlamına gelir, dizinin öğelerini silmiyorum, ancak var olmayan öğeleri (biletleri) -1 değeriyle işaretliyorum ve piyasa emri olmadığında bilet dizisini siliyorum

Keçeli kalemlere gelince, kesinlikle öyledir, göreve bağlıdır, prensip olarak, optimize ederken genellikle 2 çözüm vardır:

- veya algoritmanın karmaşıklığını ekleyin, ancak bellekten tasarruf edin ve PC bilgi işlem kaynaklarını boşa harcayın

- veya algoritmayı basitleştirir ve bilgi işlem kaynaklarından tasarruf ederiz, ancak bellek tüketiriz

 

Sağlama toplamı doğru kabul edilmez, dizide 0 varsa bir hata olabilir

Nikitin'in varyantı sadece böyle bir hata üzerinde çalışıyor.

Dosyalar:
456.mq5  20 kb
 
Vladimir Pastushak :

Sağlama toplamı doğru kabul edilmez, dizide 0 varsa bir hata olabilir

Nikitin'in varyantı sadece böyle bir hata üzerinde çalışıyor.

Evet haklısın. Ek olarak sadece Nikitin sıfır element attı. Bu yüzden kodu yanlış görünüyordu. Aslında, başlangıçta sizin tarafınızdan belirlenen görev çözüldü.
İçinde boş öğeler olup olmadığını belgelerseniz, sonuç aynıdır:

 2018.11 . 14 13 : 50 : 34.481 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 133765 микросекунд
2018.11 . 14 13 : 50 : 34.486 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 2330 микросекунд
2018.11 . 14 13 : 50 : 34.489 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 1840 микросекунд
2018.11 . 14 13 : 50 : 34.492 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 777 микросекунд
2018.11 . 14 13 : 50 : 34.497 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 2818 микросекунд
2018.11 . 14 13 : 50 : 34.503 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 3922 микросекунд
2018.11 . 14 13 : 50 : 34.510 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 4239 микросекунд
2018.11 . 14 13 : 50 : 34.519 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 7192.975450836821 ; элементов - 998993 ; время выполнения = 7307 микросекунд
2018.11 . 14 13 : 50 : 34.522 ArrayDeleteValue (BTCUSD,M15)   вариант Kuznetsov: Контрольная сумма = 7185.677992388435 ; элементов - 998993 ; время выполнения = 683 микросекунд

Şimdi sağlama toplamının daha önce hesaba katmadığı öğelerin sırasını dikkate aldığını tekrar ediyorum.

Dosyalar:
 
Evet, bıyığı. Burada bira yapıyorum. NG ile ~ 25 litre hazır olacaktır. Durum bu ve hepiniz dizilerle ilgilisiniz
 
Nikolai Semko :

Evet haklısın. Ek olarak sadece Nikitin sıfır element attı. Bu yüzden kodu yanlış görünüyordu. Aslında, başlangıçta sizin tarafınızdan belirlenen görev çözüldü.
İçinde boş öğeler olup olmadığını belgelerseniz, sonuç aynıdır:

Şimdi sağlama toplamının daha önce hesaba katmadığı öğelerin sırasını dikkate aldığını tekrar ediyorum.

Bu arada eğer sıralama çok önemliyse benim versiyonuma en sonda ArraySort ekleyebilirsiniz , aynı zamanda genel olarak ArraySort'un ne kadar etkili olduğuna bakın.

 

Şimdi cevabını bulamadığım başka bir soruyla ilgileniyorum.
Belki birisi neden böyle bir seçeneğin Kuznetsov'un kodundan açıklayabilir:

     for (;;)
     {
       while (arr[i]!=x && i<j) i++;
       while (arr[j]==x && i<j) j--;
       if (i<j)
        {
         arr[i++]=arr[j--];
        }
       else break ;
     }

bunun iki katından daha hızlı çalışır ve tam olarak aynı şeyi yapar:

   while (i<j)
     {
       if (arr[i]==x)
         if (arr[j]!=x) arr[i++]=arr[j--];
       else j--;
       else i++;
     }

Derleyicinin harikaları nelerdir?
Gerçekten böyle bir tasarım için:

 while (arr[i]!=x && i<j) i++;

derleyici, işlemci için bazı özel montajcı arama talimatları buluyor mu?
Modern işlemci talimatlarında güçlü olan var mı?

 
Maxim Kuznetsov :

Bu arada eğer sıralama çok önemliyse benim versiyonuma en sonda ArraySort ekleyebilirsiniz, aynı zamanda genel olarak ArraySort'un ne kadar etkili olduğuna bakın.

Onunla denedim. Oldukça maliyetli bir özellik. Sonradan atmak daha kolay olsa da. Tüm gerekli olanlar arka arkaya gider.


Nikolay Semko :

Evet haklısın. Ek olarak sadece Nikitin sıfır element attı. Bu yüzden kodu yanlış görünüyordu. Aslında, başlangıçta sizin tarafınızdan belirlenen görev çözüldü.
İçinde boş öğeler olup olmadığını belgelerseniz, sonuç aynıdır:

Evet, bu durumda hemen hemen her fonksiyon ayarlanabilir. İşte en son halim (tamamen deneyseldi, ancak en ucuzlarından biri gibi görünüyor.)
 template < typename T>
int arrayFilter(T &data[], const T value= NULL )
  {
     int s, _s = s = ArraySize (data);
     bool result = false ;
     
     for ( int i= 0 , j= 0 ; i<_s; i++)
     {
           if ( data[i] == value || data[i] == NULL )
          {
               result = true ;
               s--;
               continue ;
          }
           if ( result )
               data[j] = data[i];
          j++;
     }
     
     if (s < _s)
           ArrayResize (data, s);
     
     return s;
  }
 
Nikolai Semko :

:

bunun iki katından daha hızlı çalışır ve tam olarak aynı şeyi yapar:


optimize edici işe yaramaz - karşılaştırmalar 2 kattan azdır ..