Borrar una matriz de elementos definidos - página 12

 
Alexey Viktorov:

Por lo tanto, si una orden se cierra, tiene que ser "tachada" de la matriz. En estos casos, solía copiar el array "en sí mismo" y reducir el tamaño en uno.

En este caso, escribiría un ticket inexistente en el array -1 , esperaría a que se cerraran todos los pedidos y borraría todo el array (el tamaño del array debería ser 1).

En este enfoque, un elemento de la matriz de billetes (si no hay orden) se comprueba con una sola condición: if(ArrayOfTicket[i] > 0) .....

En mi opinión, es más rápido que "sacudir" constantemente la matriz

 
Igor Makanu:

En ese caso, escribiría un ticket inexistente en el array -1 , esperaría a que se cerraran todos los pedidos y borraría todo el array (tamaño del array = 1).

En este enfoque, un elemento de la matriz de billetes (si no hay orden) se comprueba con una sola condición: if(ArrayOfTicket[i] > 0) .....

En mi opinión, es más rápido que "sacudir" constantemente la matriz

No lo entiendo... Qué diferencia hay entre borrar elemento por elemento o comprobar los índices de los pedidos inexistentes... el array se agita de todos modos...

De todos modos, como han dicho hoy en las noticias, es imposible patentar el sabor. Los floureshers sólo se diferencian en el color, pero todos tienen el mismo sabor.

 
Alexey Viktorov:

No lo entiendo... Qué diferencia hay entre borrar los elementos uno a uno o comprobar los índices de los pedidos inexistentes... El array se sobrecarga de todos modos...

De todas formas, como han dicho hoy en las noticias, es imposible patentar el sabor. Los floureshers sólo se diferencian en el color, pero todos tienen el mismo sabor.

Borrar un elemento implica copiar los elementos restantes del array, no borro elementos del array, marco los elementos no existentes (tickets) con el valor -1, y borro un array de tickets cuando no hay órdenes de mercado

En cuanto a los marcadores de flotación, es definitivamente cierto, depende del problema, en principio, suele haber 2 soluciones durante la optimización:

- o bien añaden complejidad al algoritmo, pero ahorran memoria y recursos informáticos del PC

- o simplificar el algoritmo y ahorrar recursos informáticos pero desperdiciar memoria

 

La suma de comprobación no es correcta, si hay 0 en la matriz puede haber un error

La variante de Nikitin funciona precisamente con ese error.

Archivos adjuntos:
456.mq5  20 kb
 
Vladimir Pastushak:

La suma de comprobación no es correcta, si hay 0 en la matriz puede haber un error

La variante de Nikitin funciona justo para ese error.

Sí, tienes razón. Sólo Nikitin arrojó adicionalmente cero elementos. Por eso su código parecía defectuoso. En realidad, se trataba de resolver la tarea que te habías propuesto en un principio.
Si documentas su comprobación de elementos nulos, el resultado es el mismo:

2018.11.14 13:50:34.481 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 133765 микросекунд
2018.11.14 13:50:34.486 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2330 микросекунд
2018.11.14 13:50:34.489 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 1840 микросекунд
2018.11.14 13:50:34.492 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 777 микросекунд
2018.11.14 13:50:34.497 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2818 микросекунд
2018.11.14 13:50:34.503 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 3922 микросекунд
2018.11.14 13:50:34.510 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 4239 микросекунд
2018.11.14 13:50:34.519 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 7307 микросекунд
2018.11.14 13:50:34.522 ArrayDeleteValue (BTCUSD,M15)   вариант Kuznetsov: Контрольная сумма = 7185.677992388435; элементов - 998993; время выполнения = 683 микросекунд

De nuevo, la suma de comprobación ahora tiene en cuenta el orden de los elementos, antes no lo hacía.

Archivos adjuntos:
 
Oh, olvídalo. Estoy terminando mi cerveza. Tendré unos 25 litros listos para Nochevieja. Eso es lo que estás hablando.
 
Nikolai Semko:

Sí, tienes razón. Sólo que Nikitin lanzaba también elementos nulos adicionales. Por eso su código parecía estar mal. En realidad, se trataba de resolver la tarea que te habías propuesto en un principio.
Si documentas su comprobación de elementos nulos, el resultado es el mismo:

De nuevo, la suma de comprobación ahora tiene en cuenta el orden de los elementos, antes no lo hacía.

Por cierto, si el orden es muy importante, puede añadir ArraySort al final de mi variante y ver la eficacia de ArraySort en absoluto.

 

Ahora me interesa otra pregunta, a la que no encuentro respuesta.
Tal vez alguien pueda explicar por qué esta variante del código de Kuznetsov:

    for(;;)
     {
      while(arr[i]!=x && i<j) i++;
      while(arr[j]==x && i<j) j--;
      if(i<j)
        {
         arr[i++]=arr[j--];
        }
      else break;
     }

funciona más del doble de rápido que éste, que hace exactamente lo mismo:

   while(i<j)
     {
      if(arr[i]==x)
         if(arr[j]!=x) arr[i++]=arr[j--];
      else j--;
      else i++;
     }

¿Cuáles son las maravillas del compilador?
¿Es posible que para tal diseño:

while(arr[i]!=x && i<j) i++;

¿encuentra el compilador algún comando especial de búsqueda en ensamblador para el procesador?
¿Alguien es fuerte en los comandos de los procesadores modernos?

 
Maxim Kuznetsov:

Por cierto, si el orden es muy importante, puedo añadir ArraySort al final de mi versión, al mismo tiempo vamos a ver la eficacia de ArraySort en absoluto.

Lo he probado. Es una función bastante costosa. Sin embargo, es más fácil tirarlo después. Todos los necesarios van en fila.


Nikolai Semko:

Sí, tienes razón. Sólo Nikitin lanzaba además elementos nulos. Por eso su código se veía mal. En realidad, era la tarea que habías definido al principio.
Si documentas su comprobación de elementos nulos, el resultado es el mismo:

Casi cualquier función se puede adaptar a ella. Aquí está mi último (que fue puramente experimental, pero parece ser uno de los menos costosos).
template<typename T>
int arrayFilter(T &data[],const T value=NULL)
  {
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s; i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          ArrayResize(data, s);
     
     return s;
  }
 
Nikolai Semko:

:

funciona más del doble de rápido que uno que hace exactamente lo mismo:


el optimizador no tiene nada que ver - hay la mitad de comparaciones...