Si es un concurso de velocidad, ofreceré mi propia variante...
Su variante es efectivamente la más rápida, pero contiene un error: si todos los elementos de un array son iguales a un filtro, su función saldrá del array.
Voy a ofrecer mi propia variante, es un poco más lenta que la tuya:
int ArrayModify(int &a[],constint v)
{
int size=ArraySize(a)-1;
int j=0;
int total=size;
for(int i=0;i<size;i++)
{
while(a[i+j]==v && j<total)
{
j++;
size--;
}
a[i]=a[i+j];
}
size=ArrayResize(a,size);
return(size);
}
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090 2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
Lleva varios años haciendo este tipo de preguntas. ¿Has aprendido mucho? Lo siento, pero es obvio que todavía estás en el nivel de los bytes y las matrices elementales.
La propia pregunta está formulada de forma incorrecta. La tarea no consiste en eliminar los valores duplicados (tarea de nivel CME) sino en algo mucho mayor, debe actualizar la lista de elementos válidos. Si es así, la pregunta debería sonar completamente diferente. Confundes y engañas a los participantes y, en primer lugar, a ti mismo: impones a los participantes una solución equivocada en principio y pides que la hagan efectiva.
No programo por programar, no tengo el objetivo de convertirme en un megaprogramador ni de ser inteligente en los foros.
¿Qué es lo que no entiendes en la pregunta: Borrar un array de elementos definidos?
Su variante es efectivamente la más rápida, pero contiene un error: si todos los elementos de un array son iguales a un filtro, su función saldrá del array.
Te propongo mi variante, es un poco más lenta que la tuya:
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090 2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
Sí, gracias. Corregido.
int ArrayDeleteVal(int &a[],constint val) // вариант Semko
{
int size=ArraySize(a);
int i=0,start,s,count;
while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением valif(i==size) return size;
start=i; i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i==size) {ArrayResize(a,0); return0;}
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 элементов, то имеет смысл воспользоваться ArrayCopyelsefor(; s<i; start++,s++) a[start]=a[s]; // иначе простой циклif(i==size) break;
i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i<size) s=i; elsebreak;
i++;
}
if(start<size) ArrayResize(a,start); else start=size;
return(start);
}
Sólo que también tienes un error en alguna parte, porque la suma de comprobación no coincide porque falta un elemento en alguna parte. No se sabe dónde.
2018.11.1310:07:27.757 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 156757 микросекунд
2018.11.1310:07:27.761 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2338 микросекунд
2018.11.1310:07:27.764 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 1839 микросекунд
2018.11.1310:07:27.766 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 782 микросекунд
2018.11.1310:07:27.770 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 495781718; элементов - 999026; время выполнения = 2886 микросекунд
2018.11.1310:07:27.773 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2355 микросекунд
Nikolai Semko: En ambos casos, cada elemento se arrastra como máximo una vez.
Sí, lo siento, una vez en efecto. Esperaba que alguien se interesara por el enfoque del DBMS y lo comprobara, no esperé. Tuve que hacerlo yo mismo.
int ArrayDelV (int &a[],constint val) { // вариант Vladimirbool 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);
}
Insertado ArrayDeleteValue.mq5 en tu comprobador, es el doble de malo que el tuyo. He pensado en la razón y he arreglado dos líneas para que se elimine un tercio de los elementos en lugar del 0,1%.
for(int i=0; i<1000000;i++) arr[i]=rand()%3;// 1000; //генерируем исходный массив случайными значениями от 0 до 1000int Value=rand()%3; // 1000; // значение, которое нужно удалить из массива
Así es como resultó:
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Pastushak: Checksum = 333586; elementos - 667421; tiempo de ejecución = 108521 microsegundos 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Korotky: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5525 microsegundos 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Fedoseev: Checksum = 333586; elementos - 667421; tiempo de ejecución = 4879 microsegundos 2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variante Semko: Checksum = 333586; elementos - 667421; tiempo de ejecución = 14479 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Pavlov: Checksum = 998744; elementos - 667421; tiempo de ejecución = 0 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Nikitin: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5759 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Vladimir: Checksum = 333586; elementos - 667421; tiempo de ejecución = 1542 microsegundos
La variante de Pavlov tenía un error, tuve que comentarlo.
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 dado, y mucho menos en el paso 1, el compilador puede optimizarlo.
P.D. Los compiladores Pascal y Delphi de Borland hacen que en tiempo de ejecución la variable de bucle no importe (en memoria), se pone en algún lugar de los registros de la CPU.
Sí, lo siento, una vez en efecto. Esperaba que alguien se interesara por el enfoque del DBMS y lo comprobara, no esperé. Tuve que hacerlo yo mismo.
Insertado ArrayDeleteValue.mq5 en tu comprobador, es el doble de malo que el tuyo. He pensado en las razones y he arreglado dos líneas para que se elimine un tercio de los elementos en lugar del 0,1%.
Así es como resultó:
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Pastushak: Checksum = 333586; elementos - 667421; tiempo de ejecución = 108521 microsegundos 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Korotky: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5525 microsegundos 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Fedoseev: Checksum = 333586; elementos - 667421; tiempo de ejecución = 4879 microsegundos 2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variante Semko: Checksum = 333586; elementos - 667421; tiempo de ejecución = 14479 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Pavlov: Checksum = 998744; elementos - 667421; tiempo de ejecución = 0 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Nikitin: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5759 microsegundos 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Vladimir: Checksum = 333586; elementos - 667421; tiempo de ejecución = 1542 microsegundos
La variante de Pavlov tenía un error, tuve que comentarlo.
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.
P.D. Los compiladores Pascal y Delphi de Borland hacen que en tiempo de ejecución la variable de bucle no importe (en memoria), se pone en algún lugar de los registros de la CPU.
La versión de Pavlov ha sido corregida. Sus 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í:
2018.11.1312:35:38.633 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 131964 микросекунд
2018.11.1312:35:38.636 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2310 микросекунд
2018.11.1312:35:38.639 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 1834 микросекунд
2018.11.1312:35:38.641 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 773 микросекунд
2018.11.1312:35:38.645 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2815 микросекунд
2018.11.1312:35:38.648 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2475 микросекунд
2018.11.1312:35:38.653 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 496656342; элементов - 999011; время выполнения = 3608 микросекунд
Y en su versión genera una suma de comprobación incorrecta. Y la creación de un array adicional no tiene ningún beneficio, al contrario, ralentiza el proceso y consume recursos adicionales.
En esencia, todos los algoritmos son iguales. Todos modifican la matriz elemento por elemento, y todos se esfuerzan por la variante 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.
No sé qué es mt4, ni siquiera se ejecuta en win10, creo que eso es algo bueno
He ajustado la matriz.
Tuve que usar ArrayCopy , porqueMQL5 juraba que el array era estático.

Si es un concurso de velocidad, ofreceré mi propia variante...
Su variante es efectivamente la más rápida, pero contiene un error: si todos los elementos de un array son iguales a un filtro, su función saldrá del array.
Voy a ofrecer mi propia variante, es un poco más lenta que la tuya:
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
Lleva varios años haciendo este tipo de preguntas. ¿Has aprendido mucho? Lo siento, pero es obvio que todavía estás en el nivel de los bytes y las matrices elementales.
La propia pregunta está formulada de forma incorrecta. La tarea no consiste en eliminar los valores duplicados (tarea de nivel CME) sino en algo mucho mayor, debe actualizar la lista de elementos válidos. Si es así, la pregunta debería sonar completamente diferente. Confundes y engañas a los participantes y, en primer lugar, a ti mismo: impones a los participantes una solución equivocada en principio y pides que la hagan efectiva.
No programo por programar, no tengo el objetivo de convertirme en un megaprogramador ni de ser inteligente en los foros.
¿Qué es lo que no entiendes en la pregunta: Borrar un array de elementos definidos?
Su variante es efectivamente la más rápida, pero contiene un error: si todos los elementos de un array son iguales a un filtro, su función saldrá del array.
Te propongo mi variante, es un poco más lenta que la tuya:
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
Sí, gracias. Corregido.
Sólo que también tienes un error en alguna parte, porque la suma de comprobación no coincide porque falta un elemento en alguna parte. No se sabe dónde.
Lo he retocado eliminando pasajes innecesarios
En ambos casos, cada elemento se arrastra como máximo una vez.
Sí, lo siento, una vez en efecto. Esperaba que alguien se interesara por el enfoque del DBMS y lo comprobara, no esperé. Tuve que hacerlo yo mismo.
Insertado ArrayDeleteValue.mq5 en tu comprobador, es el doble de malo que el tuyo. He pensado en la razón y he arreglado dos líneas para que se elimine un tercio de los elementos en lugar del 0,1%.
Así es como resultó:
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Pastushak: Checksum = 333586; elementos - 667421; tiempo de ejecución = 108521 microsegundos
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Korotky: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5525 microsegundos
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Fedoseev: Checksum = 333586; elementos - 667421; tiempo de ejecución = 4879 microsegundos
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variante Semko: Checksum = 333586; elementos - 667421; tiempo de ejecución = 14479 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Pavlov: Checksum = 998744; elementos - 667421; tiempo de ejecución = 0 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Nikitin: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5759 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Vladimir: Checksum = 333586; elementos - 667421; tiempo de ejecución = 1542 microsegundos
La variante de Pavlov tenía un error, tuve que comentarlo.
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 dado, y mucho menos en el paso 1, el compilador puede optimizarlo.
P.D. Los compiladores Pascal y Delphi de Borland hacen que en tiempo de ejecución la variable de bucle no importe (en memoria), se pone en algún lugar de los registros de la CPU.
Sí, lo siento, una vez en efecto. Esperaba que alguien se interesara por el enfoque del DBMS y lo comprobara, no esperé. Tuve que hacerlo yo mismo.
Insertado ArrayDeleteValue.mq5 en tu comprobador, es el doble de malo que el tuyo. He pensado en las razones y he arreglado dos líneas para que se elimine un tercio de los elementos en lugar del 0,1%.
Así es como resultó:
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Pastushak: Checksum = 333586; elementos - 667421; tiempo de ejecución = 108521 microsegundos
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Korotky: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5525 microsegundos
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variante Fedoseev: Checksum = 333586; elementos - 667421; tiempo de ejecución = 4879 microsegundos
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variante Semko: Checksum = 333586; elementos - 667421; tiempo de ejecución = 14479 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Pavlov: Checksum = 998744; elementos - 667421; tiempo de ejecución = 0 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Nikitin: Checksum = 333586; elementos - 667421; tiempo de ejecución = 5759 microsegundos
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variante Vladimir: Checksum = 333586; elementos - 667421; tiempo de ejecución = 1542 microsegundos
La variante de Pavlov tenía un error, tuve que comentarlo.
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.
P.D. Los compiladores Pascal y Delphi de Borland hacen que en tiempo de ejecución la variable de bucle no importe (en memoria), se pone en algún lugar de los registros de la CPU.
La versión de Pavlov ha sido corregida.
Sus 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 su versión genera una suma de comprobación incorrecta. Y la creación de un array adicional no tiene ningún beneficio, al contrario, ralentiza el proceso y consume recursos adicionales.
Sólo que en mi caso se hace en bloques usando ArrayCopy, por lo que hay una ventaja de velocidad.