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

 
Nikolai Semko :
Aslında, tüm algoritmalar aynıdır. Herkes dizi elemanının modifikasyonunu eleman bazında gerçekleştirir ve herkes Fedoseev varyantına yönelir, çünkü onun ekstra bir şeyi yok.
Sadece benim için ArrayCopy kullanan bloklarda oluyor, bu yüzden hız kazancı var.

Peki ya Peter? Herkesi "yırttı" mı? Kimse kodunu kontrolöre eklemedi. Tahtadaki herkesi nasıl ve ne kadar dağıttığını merak ediyorum.

 
Vladimir :

Sebepleri düşündüm ve içindeki iki satırı düzelttim, böylece öğelerin üçte biri silindi,% 0.1 değil.

Sonuç: Bir dizideki adresleri sayıları arasında rastgele bir mesafe ile hesaplamak, belirli bir adımda, özellikle 1. adımda, bir satırdaki öğelerin işlenmesinden hala daha kötüdür, derleyici bunu optimize edebilir.

Ve ne demek istediğini anlıyorum. Nedense bu cümleyi kaçırdım.
Evet, elbette, bu anlaşılabilir bir durumdur, ancak yine de, her üçüncü öğeyi atmam gerektiğinde bile (ardından ArrayCopy benim için çalışmayı durdurur ve kazanç kaybolur) farklı bir resmim var:

 2018.11 . 13 13 : 46 : 01.524 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 66640 микросекунд
2018.11 . 13 13 : 46 : 01.531 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5932 микросекунд
2018.11 . 13 13 : 46 : 01.537 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5142 микросекунд
2018.11 . 13 13 : 46 : 01.544 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5831 микросекунд
2018.11 . 13 13 : 46 : 01.552 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 332864 ; элементов - 667202 ; время выполнения = 5493 микросекунд
2018.11 . 13 13 : 46 : 01.563 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 958449 ; элементов - 667202 ; время выполнения = 11026 микросекунд

Pavlov'un gerçekten çalışmayan bir seçeneği var, ancak aynı zamanda doğru sağlama toplamını ve ardından yanlış olanı da veriyorsunuz.

Dosyalar:
 
Artyom Trishkin :

Peki ya Peter? Herkesi "yırttı" mı? Kimse kodunu kontrolöre eklemedi. Tahtadaki herkesi nasıl ve ne kadar dağıttığını merak ediyorum.

Ve hayal gücünün uçuşunu asla anlamadım. Hiçbir zaman tamamlanmış bir işlev sağlamadı. Ve onun için yazmayı bitirirsem, oradaki her şeyi yeniden yaptığım için beni tekrar suçlayacaklar. ))

 
Nikolai Semko :

Ve hayal gücünün uçuşunu asla anlamadım. Asla tamamlanmış bir işlev sağlamadı. Ve onun için yazmayı bitirirsem, oradaki her şeyi yeniden yaptığım için beni tekrar suçlayacaklar. ))

Bir cep telefonundan koduna baktığımda, "doğrudan" yazdığı hissine kapıldım. Bu nedenle, bir işlev sağlamadı - arka arkaya her şeye sahip. Ve senaryosunda bir fonksiyon değil, düz çizgi kodu var. Böyle bir betiğin bir işlevi ima etmeyebileceği açık ama... Sanırım uçması için goto yeterli değil :)

Ama bunlar sadece benim hislerim.

 
Nikolai Semko :

Pavlov'un versiyonu düzeltildi.
Garip değerlerin var. Belki de kodu yeniden derlemeden profil oluşturduktan veya hata ayıklayıcıdan sonra komut dosyasını çalıştırdınız?
Bunu şöyle anlıyorum:

Ve varyantınızda yanlış sağlama toplamı üretir. Ve genel olarak, ek bir dizinin oluşturulması herhangi bir fayda sağlamaz, aksine süreci yavaşlatır ve hatta ek kaynakları tüketir.

Düzeltildi.

 int ArrayDelV( int &a[], const int val)
  { // вариант Vladimir
   bool Flags[]; // массив пометок на удаление
   int N,NewN,i,j;
   N= ArraySize (a);
   ArrayResize (Flags,N);
   if ( ArrayInitialize (Flags, false )!=N) return (- 1 );
   NewN=N; // Сколько останется
   for (i= 0 ;i<N;i++) { if (a[i]==val) {Flags[i]= true ; NewN--;}}
   j= 0 ;
   for (i= 0 ;i<N;i++) { if (!Flags[i]) {a[j]=a[i]; j++;}}
   ArrayResize (a,NewN);
   return (NewN);
  }

Birkaç kez çalıştırdım, sonuçlar sarkıyor - bilgisayar çok yüklü, sadece Cumartesi günü piyasaya sürülecek. Başka biriyle kontrol etsen iyi olur. Ancak sağlama toplamı şimdi eşleşiyor. Çok seyrek önemsiz değerler için (%0,1)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) Pastushak varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 418662 mikrosaniye
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) Korotky varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 10683 mikrosaniye
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) Fedoseev varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 9740 mikrosaniye
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) Semko varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 4691 mikrosaniye
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) Pavlov varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 12512 mikrosaniye
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) Nikitin varyantı: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 10720 mikrosaniye
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) Vladimir seçeneği: Sağlama toplamı = 497057781; elemanlar - 998984; yürütme süresi = 17197 mikrosaniye

üçüncüsü için

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) Pastushak varyantı: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 65732 mikrosaniye
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) Korotky varyantı: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 4757 mikrosaniye
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) Fedoseev varyantı: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 4815 mikrosaniye
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Semko varyantı: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 5812 mikrosaniye
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Pavlov varyantı: Sağlama toplamı = 1001157; elemanlar - 667065; çalışma zamanı = 0 mikrosaniye
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) Nikitin varyantı: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 4749 mikrosaniye
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) Vladimir seçeneği: Sağlama toplamı = 668222; elemanlar - 667065; yürütme süresi = 9814 mikrosaniye
Pavlov yine başarısız olur.

Büyük olasılıkla, for döngüsünden geçişi hızlandırma konusundaki sonucum MQL dilleri için yanlıştır.

Ve ek bir dizinin oluşturulması, gereksizlerin toplu olarak silinmesine ilişkin fiili işlemin süresini azaltmalı ve diziyi gerekli başlangıç anına kadar değiştirmeden tutmalıdır. Şimdiye kadar, veri güvenliği burada tartışılmadı.

 
Artyom Trishkin :

Peki ya Peter? Herkesi "yırttı" mı? Kimse kodunu kontrolöre eklemedi. Tahtadaki herkesi nasıl ve ne kadar dağıttığını merak ediyorum.

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

 int PeterArray( int &Arr[], const int val) // вариант Peter Konov
  {
   int deleted= 0 ,q= 0 ;
   for ( int a1= 0 ; a1< ArraySize (Arr); a1++)
     {
       if (deleted)Arr[q]=Arr[q+deleted];
       if (Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize (Arr,q);
   return (q);
  }

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.

 2018.11 . 13 14 : 08 : 32.857 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 150492 микросекунд
2018.11 . 13 14 : 08 : 32.861 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 2441 микросекунд
2018.11 . 13 14 : 08 : 32.865 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 1852 микросекунд
2018.11 . 13 14 : 08 : 32.867 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 779 микросекунд
2018.11 . 13 14 : 08 : 32.871 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 2374 микросекунд
2018.11 . 13 14 : 08 : 32.876 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 3720 микросекунд
2018.11 . 13 14 : 08 : 32.885 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 495882514 ; элементов - 999010 ; время выполнения = 7266 микросекунд
Dosyalar:
 

:-) 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)

 
Реter Konow :

Başka bir iyileştirme:

Üzgünüm, iyi bir pazarlamacı olduğunuzu söylüyorlar ama bir programcı... benden bile daha kötü.

1. Silinen dahili tamsayı değişkeni başlatılmaz, yani sıfıra eşit olur, ancak garanti edilmez. Döngüde, geri kaydırma (ilk seferde) iki nedenden dolayı olmayacak - tahmin edin ne oldu.

2. (ana) Önce dizinin elemanlarını kaydırıyorsunuz , sonra silinen değişkenin değerini artırıyorsunuz ve ardından bir döngü olacak ve bir sonraki kaydırma gereğinden fazla gerçekleşecek. Başka bir deyişle, kodunuz orijinal diziyi çığ gibi yok edecektir.

 
Aşırı seçenekler:
Dizide fazladan eleman yok:
 2018.11 . 13 14 : 44 : 33.512 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 137515 микросекунд
2018.11 . 13 14 : 44 : 33.514 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1408 микросекунд
2018.11 . 13 14 : 44 : 33.517 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1807 микросекунд
2018.11 . 13 14 : 44 : 33.519 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 672 микросекунд
2018.11 . 13 14 : 44 : 33.522 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 1433 микросекунд
2018.11 . 13 14 : 44 : 33.527 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 4025 микросекунд
2018.11 . 13 14 : 44 : 33.533 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 496983086 ; элементов - 1000000 ; время выполнения = 4297 микросекунд
Dizide, tüm ekstra öğeler:
 2018.11 . 13 14 : 47 : 15.338 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 2000000000 ; элементов - 0 ; время выполнения = 2093 микросекунд
2018.11 . 13 14 : 47 : 15.341 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 2257 микросекунд
2018.11 . 13 14 : 47 : 15.343 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 1078 микросекунд
2018.11 . 13 14 : 47 : 15.345 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 665 микросекунд
2018.11 . 13 14 : 47 : 15.348 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 1580 микросекунд
2018.11 . 13 14 : 47 : 15.353 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 4064 микросекунд
2018.11 . 13 14 : 47 : 15.362 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 0 ; элементов - 0 ; время выполнения = 7982 микросекунд
Dosyalar:
 
Алексей Тарабанов :

Üzgünüm, iyi bir pazarlamacı olduğunuzu söylüyorlar, ancak bir programcı ... benden bile daha kötü.


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

bu pazarlamacı 5 yıldır satmaya başlayamadı .. ve bir programcı olarak daha da kötü olduğunu söylüyorsunuz :-)