Borrar una matriz de elementos definidos - página 3

 
Vladimir Pastushak:

La tarea principal es limpiar la matriz de valores definidos.

Esta no puede ser la tarea principal. ¿Qué se recoge en esta matriz y cómo se utiliza después?

 
Stanislav Korotky:

Bueno, eso no es serio. Si se tira de elefantes para resolver este pequeño problema en particular, mencionaría STL::remove(array, value).

Eso es muy serio y fundamental. MQL es simplemente verboso. Terriblemente.

Operadores fundamentales como filter (que en TC es eso, filtrar), map (mapear), fold (colapsar, resumir)
debe aplicarse de inmediato, sin hacer preguntas. Y ser optimizado.

 
Maxim Kuznetsov:

Esto es muy serio y fundamental. MQL es simplemente verboso. Es horrible.

Operadores tan fundamentales como filter (que en TC es filtrado), map (mapeo), fold (suma)
deben ser implementados de inmediato, sin ninguna duda. Y ser optimizado.

La cuestión es que tirar de una dependencia tan gorda ("fundamental") para una tarea pequeña es un sinsentido. Si para escribir todo sabiamente y refactorizar todo el proyecto - entonces, por supuesto, pero no es la esencia de la pregunta original.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Limpieza de una matriz a partir de elementos especificados

Dmitry Fedoseev, 2018.11.12 23:05

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


Esto es una especie de vergüenza...©

1. Comparar variables de tipo double mediante ==, por decirlo suavemente, no es cómico;
2. La complejidad del código es O(n^2), y la peor complejidad para este problema con una secuencia de entrada sin ordenar debería ser O(n);
3. El código no funciona, porque cuando la función se utiliza realmente, es imposible determinar cuántos valores válidos contiene el array devuelto:

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


int OnStart(){
   double arr[] = {3, 5, 5, 3, 3, 5, 5, 3};
   double v = 3;
   
   ArrayPrint(arr);
   DelEl(arr, v);
   ArrayPrint(arr);
   
   return INIT_SUCCEEDED;
}


Resultado de la ejecución:

2018.11.13 00:35:33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11.13 00:37:08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

Los valores no válidos están resaltados en rojo, nunca fueron eliminados de la matriz.

 
Sergey Dzyublik:


Esto es una especie de vergüenza...©

1. No es agradable comparar variables del tipo double mediante ==, por decirlo suavemente;
2. La complejidad del código es O(n^2), y la complejidad en el peor de los casos para este problema con una secuencia de entrada sin ordenar debería ser O(n);
3. El código no funciona, porque cuando la función se utiliza realmente, es imposible determinar cuántos valores válidos contiene el array devuelto:


Resultado de la ejecución:

Los valores no válidos que nunca se han eliminado de la matriz se resaltan en rojo.

¿Jublik? Que así sea. La comparación de variables de tipo doble es bastante cómica si no se calculan antes de comparar.

Aprende las matemáticas. ¿Y la vergüenza?

 
Sergey Dzyublik:


Esto es una especie de vergüenza...©

1. Comparar variables de tipo double con == no es, por decirlo suavemente, cómico;
2. La complejidad del código es O(n^2), y la peor complejidad para este problema con una secuencia de entrada no ordenada debería ser O(n);
3. El código no funciona, porque cuando la función se utiliza realmente, es imposible determinar cuántos valores válidos contiene el array devuelto:


Resultado de la ejecución:

Los valores no válidos que nunca se han eliminado de la matriz se resaltan en rojo.

No seas absurdo. ¿Le explico su error o lo adivina usted mismo? No es difícil en absoluto...

Tres puntos, tres corrales. En realidad, no, sólo dos potreros.

ps, pero tengo fe en ti.

ps2 aquí está el resultado si se utiliza la función correctamente:


 

Así está mejor:

void DelEl2(double & a[],double v){
   int sz=ArraySize(a);
   int i=0;   
   int j=0;
   for(;i<sz;i++){ 
      if(a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize(a,j);
}
 
Dmitry Fedoseev:

Así está mejor:

Dimitri, permíteme que te moleste: v también es un array.

Y de todos modos, todo es un montón de tonterías.

 
Алексей Тарабанов:

Dimitri, permíteme que te moleste: v también es un array.

Y en general, todo esto es un total sinsentido.

Si v es un array, no hay problema. Pero el hecho de que sea una tontería es más probable. Nunca he sentido la necesidad de resolver esta tarea.

 

Si es un concurso de velocidad, también ofreceré mi propia variante:

int ArrayDeleteVal(int &a[],const int val) // вариант Semko
  {
   int size=ArraySize(a);
   int i=0,start,s,count;
   while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   s=i; i++;
   while(true)
     {
      while(i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
      if(count>6) { ArrayCopy(a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
      else for(; s<i; start++,s++) a[start]=a[s];                // иначе простой цикл
      if(i==size) break;
      i++;
      while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
      if(i<size) s=i; else break;
      i++;
     }
   if(start<size) ArrayResize(a,start); else start=size;
   return(start);
  }

He escrito un script de prueba para todas las variantes.
Este es el resultado para una matriz de 1 000 000 de elementos (unos 1000 valores adicionales):

2018.11.12 19:50:02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.12 19:50:02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.12 19:50:02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.12 19:50:02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
¿Quién es el siguiente? :))
Peter, Awww....
Archivos adjuntos: