Cancellare un array di elementi definiti - pagina 24

 

Ecco la versione migliore, usando la ricerca binaria.

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


Non parlo russo, uso google translate.
 
jdjahfkahjf:

Non è russo, è difficile da capire. El habla espanol.

Ero tentato di imparare lo spagnolo quando passavo di lì, ma ho rinunciato... per niente.
 
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;
}

Il modo in cui ne hai bisogno è il modo in cui puoi evocarlo alla fine.

 
Konstantin Nikitin:

Il modo in cui ne hai bisogno è il modo in cui puoi evocarlo alla fine.

una copia di value[] da ordinare quando si entra nella funzione e

la ricerca binaria sarà più veloce, lo spagnolo è proprio qui.

 
Maxim Kuznetsov:

una copia di value[] da ordinare quando si entra nella funzione e

la ricerca binaria sarà più veloce, lo spagnolo ha ragione.

Non mi sono preoccupato di questo. Ho appena fatto un trasferimento veloce. Sì, e ci possono essere array di stringhe.

P.S. Sono stufo di questo intrattenimento. È ora di mettersi al lavoro.
 
Maxim Kuznetsov:

una copia di value[] da ordinare quando si entra nella funzione e

la ricerca binaria sarà più veloce, lo spagnolo ha ragione.

Io userei la struttura dati HashSet per il valore.
La complessità sarebbe O(n) + O(m).

Per la ricerca binaria proposta, la complessità sarebbe: O(n log(m))

 

24 pagine - non capisco da dove viene il temperamento e quanto si può passare attraverso un compito primitivo, ha preso lo script dalla terza pagina, poiché non c'è forza per leggere oltre, ha aggiunto tre righe, inline senza funzioni.

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

è strano, ma sembra che abbia battuto tutti - "in cinque minuti e senza trucchi" (c) e sia andato a letto...))

File:
 
Ivan Negreshniy:

24 pagine - non capisco da dove viene il temperamento e quanto si può passare attraverso un compito primitivo, ha preso lo script dalla terza pagina, poiché non c'è forza per leggere oltre, ha aggiunto tre righe, inline senza funzioni.

è strano, ma sembra che ho battuto tutti - "in cinque minuti e senza trucchi" (c) e sono andato a letto...)))

1. 1. Hai preso del codice di età sconosciuta, e questa è una mancanza di rispetto diretta alla comunità;
2. Hai fatto delle modifiche al codice, nagamno-codificando da qualche parte all'interno, senza nemmeno metterle in una funzione separata;
3. Poi, apparentemente, hai lanciato il codice per il test delle prestazioni in compilazione DEBUG, dato che sia la velocità di esecuzione che i risultati non corrispondono alla versione RELEASE.
4. Il tuo codice contiene errori e non risolve affatto il problema. (Poichéarr[N--] può contenere unvalore che non è stato né filtrato né cancellato).

Ma con pathos da tale "vincitore"...

 

OK. Finché non c'è lavoro, il test della follia continua. Ho aggiunto un nuovo test vettoriale e incluso l'opzione di@Ivan Negreshniy allo stesso tempo, guarda, risolvi i tuoi errori, il tuo algoritmo non funziona.

Abbiamo questo

1

File:
 

Ottimizzazione minore

P.S. corretto gli errori e sostituito il file

File: