Borrar una matriz de elementos definidos - página 24

 

Aquí está la mejor versión, utilizando la búsqueda 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); 
}


No hablo ruso, uso el google translate.
 
jdjahfkahjf:

No es ruso, es difícil de entender. El habla español.

Tuve la tentación de aprender español cuando estuve de paso por allí, pero de alguna manera lo dejé... en vano
 
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;
}

Cómo lo necesitas es cómo puedes convocarlo al final.

 
Konstantin Nikitin:

Como lo necesites es como puedes convocarlo al final.

una copia del valor[] que se ordenará al entrar en la función y

la búsqueda binaria será más rápida, el español está aquí.

 
Maxim Kuznetsov:

una copia del valor[] que se ordenará al entrar en la función y

la búsqueda binaria será más rápida, el español tiene razón en eso.

No me molesté en hacerlo. Acabo de hacer una transferencia rápida. Sí, y puede haber matrices de cadenas.

P.D. Estoy harto de este entretenimiento. Es hora de ir al grano.
 
Maxim Kuznetsov:

una copia del valor[] que se ordenará al entrar en la función y

la búsqueda binaria será más rápida, el español tiene razón en eso.

Yo utilizaría la estructura de datos HashSet para el valor.
La complejidad sería O(n) + O(m).

Para la búsqueda binaria propuesta, la complejidad sería: O(n log(m))

 

24 páginas - No entiendo de dónde viene el temperamento y cuánto se puede pasar por una tarea primitiva, tomó la secuencia de comandos de la tercera página, ya que no hay fuerza para leer más, agregó tres líneas, en línea sin funciones.

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

es extraño, pero parece que ganó a todos - "en cinco minutos y sin trucos" (c) y se fue a la cama...))

Archivos adjuntos:
 
Ivan Negreshniy:

24 páginas - No entiendo de dónde viene el temperamento y cuánto se puede pasar por una tarea primitiva, tomó la secuencia de comandos de la tercera página, ya que no hay fuerza para leer más, agregó tres líneas, en línea sin funciones.

es extraño, pero parece que gané a todos - "en cinco minutos y sin trucos" (c) y se fue a la cama ...))

1. 1. Tomaste código de edad desconocida, y esto es una falta de respeto directa a la comunidad;
2. Hiciste cambios en el código, nagamno-codificando en algún lugar dentro, sin siquiera ponerlos en una función separada;
3. Luego, aparentemente, lanzaste el código para pruebas de rendimiento en la compilación DEBUG, ya que tanto la velocidad de ejecución como los resultados no corresponden a la versión RELEASE.
4. Tu código contiene errores y no resuelve el problema en absoluto. (Ya quearr[N--] puede contener unvalor que no fue filtrado ni eliminado).

Pero con el patetismo de tal "ganador"...

 

DE ACUERDO. Mientras no haya trabajo, la prueba loca continúa. He añadido un nuevo test vectorial y he incluido la opción de@Ivan Negreshniy al mismo tiempo, mira, resuelve tus errores, tu algoritmo no funciona.

Tenemos esto

1

Archivos adjuntos:
 

Optimización menor

P.D. corregidos los errores y sustituido el archivo

Archivos adjuntos: