Cancellare un array di elementi definiti - pagina 9

 
Nikolai Semko:
In sostanza, tutti gli algoritmi sono uguali. Tutti modificano l'array elemento per elemento, e tutti si sforzano di ottenere la variante Fedoseev, perché non ha nulla di inutile.
Solo che nel mio caso, è fatto in blocchi usando ArrayCopy, quindi c'è un vantaggio di velocità.

E Pyotr? Si sono tutti "stracciati"? Nessuno ha messo il suo codice nel checker. Mi chiedo come, e fino a che punto, abbia fatto saltare tutti sul tabellone.

 
Vladimir:

Ho pensato alle ragioni e ho corretto due righe in esso per rimuovere un terzo degli elementi, non lo 0,1%.

Conclusione: calcolare gli indirizzi in un array con una distanza arbitraria tra i loro numeri è ancora peggio che processare gli elementi in una riga in un determinato passo, tanto più che al passo 1 il compilatore può ottimizzarlo.

Oh, capisco cosa vuoi dire. In qualche modo mi sono perso questa frase
Sì, certo che è chiaro, ma ancora, anche quando devo buttare fuori ogni terzo elemento (poi ArrayCopy smette di funzionare per me e le vincite scompaiono) il quadro è diverso:

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 микросекунд

La variante di Pavlov non funziona davvero, ma avete anche un checksum corretto e uno scorretto.

File:
 
Artyom Trishkin:

E che dire di Peter? Li hai fatti a pezzi tutti? Nessuno ha inserito il suo codice nel checker. È interessante come e fino a che punto ha fatto saltare tutti sul tabellone.

Continuo a non capire il suo volo di fantasia. Non ha ancora fornito una funzione pronta. E se lo completo per lui, mi accuserà di nuovo di rifare tutto. ))

 
Nikolai Semko:

Continuo a non capire il suo volo di fantasia. Non ha ancora fornito una funzione pronta. E se lo completo per lui, mi accuserà di nuovo di rifare tutto. ))

Beh, guardando il suo codice da un telefono cellulare ho avuto l'impressione che scrive in modo "diretto". Ecco perché non ha fornito la funzione - fa tutto in fila. E il suo script non è una funzione ma un codice semplice. Naturalmente, un tale script può non implicare una funzione, ma... Penso che gli manchi il goto per i suoi voli :)

Ma questa è solo la mia sensazione.

 
Nikolai Semko:

Corretta la variante di Pavlov.
I vostri valori sono strani. Forse avete eseguito lo script dopo la profilazione o il debug senza ricompilare il codice?
È così che funziona per me:

E nella tua variante dà un checksum sbagliato. La creazione di un array aggiuntivo non è affatto redditizia, al contrario, rallenta il processo e consuma risorse aggiuntive.

Corretto.

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

L'ho eseguito un paio di volte, i risultati sono penzolanti - il computer è molto occupato, non sarà libero fino a sabato. Meglio controllare con qualcun altro. Ma il checksum ora corrisponde. Per valori superflui molto radi (0,1%)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) opzione Pastushak: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 418662 microsecondi
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 10683 microsecondi
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 9740 microsecondi
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 4691 microsecondi
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 12512 microsecondi
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 10720 microsecondi
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 497057781; elementi - 998984; tempo di esecuzione = 17197 microsecondi

per un terzo

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Pastushak: Checksum = 668222; elementi - 667065; tempo di esecuzione = 65732 microsecondi
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 668222; elementi - 667065; tempo di esecuzione = 4757 microsecondi
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 668222; elementi - 667065; tempo di esecuzione = 4815 microsecondi
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 668222; elementi - 667065; tempo di esecuzione = 5812 microsecondi
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 1001157; elementi - 667065; tempo di esecuzione = 0 microsecondi
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 668222; elementi - 667065; tempo di esecuzione = 4749 microsecondi
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 668222; elementi - 667065; tempo di esecuzione = 9814 microsecondi
Pavlov si è schiantato di nuovo.

La mia conclusione sulla velocizzazione dei cicli for loop è probabilmente errata per i linguaggi MQL.

E la creazione di un array aggiuntivo dovrebbe ridurre la durata della transazione stessa rimuovendo quelli superflui, mantenendo l'array invariato fino al momento necessario del suo inizio. Finora non si è parlato di conservazione dei dati.

 
Artyom Trishkin:

E Peter? Ha "stracciato" tutti? Nessuno ha messo il suo codice nel checker. Mi chiedo come, e fino a che punto, abbia fatto saltare tutti sul tabellone.

Ma sono riuscito a procurarmi la versione di Peter.

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

È abbastanza compatto e funziona anche correttamente. Complimenti a Pyotr.
Ma in termini di velocità è al secondo posto dalla fine. O il primo posto dalla fine, se non si conta l'originale versione completamente inadatta alla velocità del proprietario di questo thread.

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 микросекунд
File:
 

:-) se non si cerca di mantenere l'ordine, il tempo è O(1), il numero totale di passi di tutti i cicli = dimensione dell'array

troppo pigro per codificare :-)

1. Cerca i primi 3 da sinistra a destra.

2. se trovato, allora cercate un non-tre da destra a sinistra, copiatelo al posto del 3.

continuare fino a quando 1,2 si sono intersecati, tagliare l'array per il numero di copie.

idealmente, è esattamente 1/2 di"bubble sorting" :-) se, invece di copiare, fate uno scambio, l'output sarà un array parzialmente ordinato (tutti i 3 terzi spostati a destra)

 
Реter Konow:

Più raffinatezza:

Scusa, dicono che sei un buon commerciante, ma un programmatore... anche peggio di me.

1. La variabile interna intera cancellata non è inizializzata, quindi sarà zero, ma non garantito. Nel ciclo, lo spostamento all'indietro non avverrà (la prima volta) per due motivi contemporaneamente - indovinate quale.

2. (soprattutto) prima si spostano gli elementi dell'array, poi si aumenta il valore della variabile cancellata, e poi ci sarà un ciclo e il prossimo spostamento avverrà uno più del necessario. In altre parole, il vostro codice valangherà l'array originale.

 
Opzioni estreme:
Non ci sono elementi extra nell'array:
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 микросекунд
L'array ha tutti gli elementi non necessari:
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 микросекунд
File:
 
Алексей Тарабанов:

Scusa, dicono che sei un buon commerciante, ma un programmatore... anche peggio di me.


Alexei, stai uccidendo un giovane talento...

questo marketer non è stato in grado di iniziare a vendere per 5 anni...e tu dici che è ancora peggio come programmatore :-)