Borrar una matriz de elementos definidos - página 9

 
Nikolai Semko:
En esencia, todos los algoritmos son iguales. Todos modifican la matriz elemento por elemento, y todos se esfuerzan por la variante de Fedoseev, porque no tiene nada innecesario.
Sólo que en mi caso, se hace en bloques usando ArrayCopy, por lo que hay una ventaja de velocidad.

¿Y qué pasa con Pyotr? ¿Todo el mundo se ha "desgarrado"? Nadie ha puesto su código en el corrector. Me pregunto cómo, y hasta qué punto, dejó boquiabiertos a todos en el tablero.

 
Vladimir:

He pensado en las razones y he corregido dos líneas para eliminar un tercio de los elementos, no el 0,1%.

Conclusión: calcular direcciones en un array con una distancia arbitraria entre sus números sigue siendo peor que procesar elementos en una fila en un paso determinado, más aún en el paso 1, el compilador puede optimizarlo.

Oh, ya veo lo que quieres decir. Por alguna razón se me pasó esta frase
Sí, claro que está claro, pero aun así, aunque tenga que tirar uno de cada tres elementos (entonces ArrayCopy deja de funcionarme y las ganancias desaparecen) la imagen es diferente:

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 de Pavlov realmente no funciona, pero también tienes sumas de verificación correctas e incorrectas.

Archivos adjuntos:
 
Artyom Trishkin:

¿Y qué pasa con Peter? ¿Los has destrozado todos? Nadie introdujo su código en el comprobador. Es interesante cómo y hasta qué punto ha sorprendido a todo el mundo en el tablero.

Sigo sin entender su fuga. Todavía no ha proporcionado una función preparada. Y si lo termino por él, me acusará de nuevo de rehacerlo todo. ))

 
Nikolai Semko:

Sigo sin entender su fuga. Todavía no ha proporcionado una función preparada. Y si lo termino por él, me acusará de nuevo de rehacerlo todo. ))

Pues bien, viendo su código desde un teléfono móvil me dio la impresión de que escribe de forma "directa". Por eso no proporcionó la función: lo hace todo seguido. Y su script no es una función sino un código directo. Por supuesto, un guión así puede no implicar una función, pero... Creo que le falta goto para sus vuelos :)

Pero eso es sólo mi sensación.

 
Nikolai Semko:

Corregida la variante de Pavlov.
Tus valores son extraños. ¿Quizás has ejecutado el script después de perfilar o depurar sin recompilar el código?
Así es como funciona para mí:

Y en tu variante da una suma de comprobación errónea. La creación de una matriz adicional no es nada rentable, al contrario, ralentiza el proceso y consume recursos adicionales.

Corregido.

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

Lo he ejecutado un par de veces, los resultados están colgados - el ordenador está muy ocupado, no estará libre hasta el sábado. Será mejor que lo compruebes con otra persona. Pero la suma de comprobación ahora coincide. Para valores innecesarios muy dispersos (0,1%)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) opción Pastushak: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 418662 microsegundos
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 10683 microsegundos
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 9740 microsegundos
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 4691 microsegundos
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 12512 microsegundos
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 10720 microsegundos
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 497057781; elementos - 998984; tiempo de ejecución = 17197 microsegundos

para un tercio

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Pastushak: Checksum = 668222; elementos - 667065; tiempo de ejecución = 65732 microsegundos
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 668222; elementos - 667065; tiempo de ejecución = 4757 microsegundos
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 668222; elementos - 667065; tiempo de ejecución = 4815 microsegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 668222; elementos - 667065; tiempo de ejecución = 5812 microsegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 1001157; elementos - 667065; tiempo de ejecución = 0 microsegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 668222; elementos - 667065; tiempo de ejecución = 4749 microsegundos
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 668222; elementos - 667065; tiempo de ejecución = 9814 microsegundos
Pavlov se ha estrellado de nuevo.

Mi conclusión sobre la aceleración de los bucles for es probablemente incorrecta para los lenguajes MQL.

Y la creación de un array adicional debería reducir la duración de la propia transacción al eliminar los superfluos, manteniendo el array sin cambios hasta el momento necesario de su inicio. Hasta ahora no se ha hablado de la integridad de los datos.

 
Artyom Trishkin:

¿Qué pasa con Peter? ¿Ha "destrozado" a todo el mundo? Nadie ha puesto su código en el corrector. Me pregunto cómo, y hasta qué punto, dejó boquiabiertos a todos en el tablero.

Pero he conseguido hacerme con la versión de 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);
  }

Es bastante compacto e incluso funciona correctamente. Felicidades a Pyotr.
Pero en términos de velocidad se sitúa en segundo lugar desde el final. O el primer puesto desde el final si no se cuenta la versión original, completamente inadecuada para la velocidad, del dueño de este hilo.

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

:-) si no intentas mantener el orden, el tiempo es O(1) , el número total de pasos de todos los bucles= tamaño del array

demasiado perezoso para codificar :-)

1. Busca los 3 primeros de izquierda a derecha.

2. si se encuentra, entonces busca un no-tres de derecha a izquierda, cópialo en el lugar del 3.

continuar hasta que 1,2 se hayan cruzado, recortar la matriz por el número de copias.

idealmente, es exactamente 1/2 de la"ordenación de burbujas" :-) si, en lugar de copiar, haces un intercambio, la salida será un array parcialmente ordenado (los 3 tercios movidos a la derecha)

 
Реter Konow:

Más refinamiento:

Lo siento, dicen que eres un buen vendedor, pero un programador... incluso peor que yo.

1. La variable entera interna no está inicializada, por lo que será cero, pero no está garantizado. En el bucle, el desplazamiento hacia atrás no se producirá (la primera vez) por dos razones a la vez: adivina cuál.

2. (lo más importante) primero se desplazan los elementos del array, luego se incrementa el valor de la variable eliminada, y luego se produce un bucle y el siguiente desplazamiento se produce uno más de lo necesario. En otras palabras, su código avalará el array original.

 
Opciones extremas:
No hay elementos extra en el 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 микросекунд
El array tiene todos los elementos innecesarios:
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 микросекунд
Archivos adjuntos:
 
Алексей Тарабанов:

Lo siento, dicen que eres un buen vendedor, pero un programador... incluso peor que yo.


Alexei, estás matando a un joven talento...

este comercializador lleva 5 años sin poder empezar a vender...y dices que es aún peor como programador :-)