Nikolai Semko: Em essência, todos os algoritmos são os mesmos. Todos modificam a matriz elemento por elemento, e todos se esforçam pela variante de Fedoseev, porque ela não tem nada desnecessário. Somente no meu caso, isso é feito em blocos usando o ArrayCopy, portanto, há uma vantagem de velocidade.
E quanto a Pyotr? Todos "rasgaram"? Ninguém colocou seu código no verificador. Pergunto-me como, e até que ponto, ele explodiu todos no quadro.
Pensei nas razões e corrigi duas linhas para remover um terço dos elementos, não 0,1%.
Conclusão: calcular endereços em uma matriz com uma distância arbitrária entre seus números ainda é pior do que processar itens em fila em uma determinada etapa, ainda mais na etapa 1, o compilador pode otimizá-la.
Ah, estou entendendo o que você quer dizer. De alguma forma eu perdi esta frase Sim, claro que é claro, mas mesmo assim, mesmo quando eu tenho que jogar fora cada terceiro elemento (então o ArrayCopy deixa de trabalhar para mim e os ganhos desaparecem) o quadro é diferente:
2018.11.1313:46:01.524 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 332864; элементов - 667202; время выполнения = 66640 микросекунд
2018.11.1313:46:01.531 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5932 микросекунд
2018.11.1313:46:01.537 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5142 микросекунд
2018.11.1313:46:01.544 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5831 микросекунд
2018.11.1313:46:01.552 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5493 микросекунд
2018.11.1313:46:01.563 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 958449; элементов - 667202; время выполнения = 11026 микросекунд
A variante de Pavlov realmente não funciona, mas você também tem o checksum correto e incorreto.
E o Peter? Você as despedaçou todas? Ninguém inseriu seu código no verificador. É interessante como e até que ponto ele arrebentou com todos os membros da diretoria.
Eu ainda não entendo seu vôo de fantasia. Ele ainda não forneceu uma função pronta para uso. E se eu o completar para ele, ele me acusará novamente de refazer tudo. ))
Eu ainda não entendo seu vôo de fantasia. Ele ainda não forneceu uma função pronta para uso. E se eu o completar para ele, ele me acusará novamente de refazer tudo. ))
Bem, olhando para seu código de um telefone celular, tive a impressão de que ele escreve de "maneira direta". É por isso que ele não forneceu a função - ele faz tudo de uma vez. E seu roteiro não é uma função, mas um código simples. É claro que tal roteiro pode não implicar uma função, mas... Acho que lhe falta ir para seus vôos :)
Variante fixa do Pavlov. Seus valores são estranhos. Talvez você tenha executado o script depois de fazer o perfil ou depuração sem recompilar o código? É assim que funciona para mim:
E em sua variante dá um checksum errado. A criação de uma matriz adicional não é nada lucrativa, pelo contrário, retarda o processo e consome recursos adicionais.
Corrigido.
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);
}
Já o executei algumas vezes, os resultados estão suspensos - o computador está muito ocupado, não estará livre até sábado. É melhor verificar com outra pessoa. Mas o checksum agora corresponde. Para valores desnecessários altamente esparsos (0,1%)
2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) opção Pastushak: Checksum = 497057781; elementos - 998984; tempo de execução = 418662 microssegundos 2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 497057781; elementos - 998984; tempo de execução = 10683 microssegundos 2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 497057781; elementos - 998984; tempo de execução = 9740 microssegundos 2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 497057781; elementos - 998984; tempo de execução = 4691 microssegundos 2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 497057781; elementos - 998984; tempo de execução = 12512 microssegundos 2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 497057781; elementos - 998984; tempo de execução = 10720 microssegundos 2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 497057781; elementos - 998984; tempo de execução = 17197 microssegundos
por um terço
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Pastushak: Checksum = 668222; elementos - 667065; tempo de execução = 65732 microssegundos 2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 668222; elementos - 667065; tempo de execução = 4757 microssegundos 2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 668222; elementos - 667065; tempo de execução = 4815 microssegundos 2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 668222; elementos - 667065; tempo de execução = 5812 microssegundos 2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 1001157; elementos - 667065; tempo de execução = 0 microssegundos 2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 668222; elementos - 667065; tempo de execução = 4749 microssegundos 2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 668222; elementos - 667065; tempo de execução = 9814 microssegundos Pavlov se despenhou novamente.
Minha conclusão sobre a aceleração do loop para loops é provavelmente incorreta para os idiomas MQL.
E a criação de uma matriz adicional deve reduzir a duração da própria transação, removendo as supérfluas, mantendo a matriz inalterada até o momento necessário de seu início. Até agora, não se tem falado aqui em preservação de dados.
E o Peter? Será que ele "rasgou" todos? Ninguém colocou seu código no verificador. Pergunto-me como, e até que ponto, ele explodiu todos no quadro.
Mas eu consegui obter a versão de Peter.
int PeterArray(int &Arr[],constint 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);
}
É bastante compacto e até funciona corretamente. Kudos a Pyotr. Mas em termos de velocidade, ele ocupa o segundo lugar desde o final. Ou primeiro lugar a partir do final se você não contar o original, completamente inadequado para a versão de velocidade do proprietário desta linha.
2018.11.1314:08:32.857 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 150492 микросекунд
2018.11.1314:08:32.861 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2441 микросекунд
2018.11.1314:08:32.865 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 1852 микросекунд
2018.11.1314:08:32.867 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 779 микросекунд
2018.11.1314:08:32.871 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2374 микросекунд
2018.11.1314:08:32.876 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 3720 микросекунд
2018.11.1314:08:32.885 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 7266 микросекунд
:-) se você não tentar manter a ordem, o tempo é O(1) , o número total de etapas de todos os loops= tamanho da matriz
muito preguiçoso para codificar :-)
1. procurar pelos 3 primeiros da esquerda para a direita.
2. Se for encontrado, então procure um não-terceiro da direita para a esquerda, copie-o para o lugar do 3.
continuar até que 1,2 se tenham cruzado, aparar a matriz pelo número de cópias.
idealmente, é exatamente 1/2 de"separação de bolhas" :-) se, ao invés de copiar, você fizer uma troca, a saída será uma matriz parcialmente ordenada (todos os 3 terços movidos para a direita)
Desculpe, dizem que você é um bom comerciante, mas um programador... ainda pior do que eu.
1. A variável interna inteira não é inicializada, portanto será zero, mas não é garantida. No loop, o deslocamento para trás não acontecerá (a primeira vez) por duas razões ao mesmo tempo - adivinhe qual delas.
2. (mais importante) você primeiro desloca os elementos da matriz, depois aumenta o valor da variável eliminada, e então haverá um loop e o próximo turno acontecerá mais um do que o necessário. Em outras palavras, seu código irá avalanche a matriz original.
Opções extremas: Não há elementos extras na matriz:
2018.11.1314:44:33.512 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 137515 микросекунд
2018.11.1314:44:33.514 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1408 микросекунд
2018.11.1314:44:33.517 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1807 микросекунд
2018.11.1314:44:33.519 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 672 микросекунд
2018.11.1314:44:33.522 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1433 микросекунд
2018.11.1314:44:33.527 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4025 микросекунд
2018.11.1314:44:33.533 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4297 микросекунд
A matriz tem todos os elementos desnecessários:
2018.11.1314:47:15.338 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 2000000000; элементов - 0; время выполнения = 2093 микросекунд
2018.11.1314:47:15.341 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 0; элементов - 0; время выполнения = 2257 микросекунд
2018.11.1314:47:15.343 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 0; элементов - 0; время выполнения = 1078 микросекунд
2018.11.1314:47:15.345 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 0; элементов - 0; время выполнения = 665 микросекунд
2018.11.1314:47:15.348 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 0; элементов - 0; время выполнения = 1580 микросекунд
2018.11.1314:47:15.353 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 0; элементов - 0; время выполнения = 4064 микросекунд
2018.11.1314:47:15.362 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 0; элементов - 0; время выполнения = 7982 микросекунд
Em essência, todos os algoritmos são os mesmos. Todos modificam a matriz elemento por elemento, e todos se esforçam pela variante de Fedoseev, porque ela não tem nada desnecessário.
Somente no meu caso, isso é feito em blocos usando o ArrayCopy, portanto, há uma vantagem de velocidade.
E quanto a Pyotr? Todos "rasgaram"? Ninguém colocou seu código no verificador. Pergunto-me como, e até que ponto, ele explodiu todos no quadro.
Pensei nas razões e corrigi duas linhas para remover um terço dos elementos, não 0,1%.
Conclusão: calcular endereços em uma matriz com uma distância arbitrária entre seus números ainda é pior do que processar itens em fila em uma determinada etapa, ainda mais na etapa 1, o compilador pode otimizá-la.
Ah, estou entendendo o que você quer dizer. De alguma forma eu perdi esta frase
Sim, claro que é claro, mas mesmo assim, mesmo quando eu tenho que jogar fora cada terceiro elemento (então o ArrayCopy deixa de trabalhar para mim e os ganhos desaparecem) o quadro é diferente:
A variante de Pavlov realmente não funciona, mas você também tem o checksum correto e incorreto.
E o Peter? Você as despedaçou todas? Ninguém inseriu seu código no verificador. É interessante como e até que ponto ele arrebentou com todos os membros da diretoria.
Eu ainda não entendo seu vôo de fantasia. Ele ainda não forneceu uma função pronta para uso. E se eu o completar para ele, ele me acusará novamente de refazer tudo. ))
Eu ainda não entendo seu vôo de fantasia. Ele ainda não forneceu uma função pronta para uso. E se eu o completar para ele, ele me acusará novamente de refazer tudo. ))
Bem, olhando para seu código de um telefone celular, tive a impressão de que ele escreve de "maneira direta". É por isso que ele não forneceu a função - ele faz tudo de uma vez. E seu roteiro não é uma função, mas um código simples. É claro que tal roteiro pode não implicar uma função, mas... Acho que lhe falta ir para seus vôos :)
Mas esse é apenas o meu sentimento.
Variante fixa do Pavlov.
Seus valores são estranhos. Talvez você tenha executado o script depois de fazer o perfil ou depuração sem recompilar o código?
É assim que funciona para mim:
E em sua variante dá um checksum errado. A criação de uma matriz adicional não é nada lucrativa, pelo contrário, retarda o processo e consome recursos adicionais.
Corrigido.
Já o executei algumas vezes, os resultados estão suspensos - o computador está muito ocupado, não estará livre até sábado. É melhor verificar com outra pessoa. Mas o checksum agora corresponde. Para valores desnecessários altamente esparsos (0,1%)
2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) opção Pastushak: Checksum = 497057781; elementos - 998984; tempo de execução = 418662 microssegundos
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 497057781; elementos - 998984; tempo de execução = 10683 microssegundos
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 497057781; elementos - 998984; tempo de execução = 9740 microssegundos
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 497057781; elementos - 998984; tempo de execução = 4691 microssegundos
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 497057781; elementos - 998984; tempo de execução = 12512 microssegundos
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 497057781; elementos - 998984; tempo de execução = 10720 microssegundos
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 497057781; elementos - 998984; tempo de execução = 17197 microssegundos
por um terço
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Pastushak: Checksum = 668222; elementos - 667065; tempo de execução = 65732 microssegundos
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Korotky: Checksum = 668222; elementos - 667065; tempo de execução = 4757 microssegundos
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variante Fedoseev: Checksum = 668222; elementos - 667065; tempo de execução = 4815 microssegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Semko: Checksum = 668222; elementos - 667065; tempo de execução = 5812 microssegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Pavlov: Checksum = 1001157; elementos - 667065; tempo de execução = 0 microssegundos
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variante Nikitin: Checksum = 668222; elementos - 667065; tempo de execução = 4749 microssegundos
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variante Vladimir: Checksum = 668222; elementos - 667065; tempo de execução = 9814 microssegundos
Pavlov se despenhou novamente.
Minha conclusão sobre a aceleração do loop para loops é provavelmente incorreta para os idiomas MQL.
E a criação de uma matriz adicional deve reduzir a duração da própria transação, removendo as supérfluas, mantendo a matriz inalterada até o momento necessário de seu início. Até agora, não se tem falado aqui em preservação de dados.
E o Peter? Será que ele "rasgou" todos? Ninguém colocou seu código no verificador. Pergunto-me como, e até que ponto, ele explodiu todos no quadro.
Mas eu consegui obter a versão de Peter.
É bastante compacto e até funciona corretamente. Kudos a Pyotr.
Mas em termos de velocidade, ele ocupa o segundo lugar desde o final. Ou primeiro lugar a partir do final se você não contar o original, completamente inadequado para a versão de velocidade do proprietário desta linha.
:-) se você não tentar manter a ordem, o tempo é O(1) , o número total de etapas de todos os loops= tamanho da matriz
muito preguiçoso para codificar :-)
1. procurar pelos 3 primeiros da esquerda para a direita.
2. Se for encontrado, então procure um não-terceiro da direita para a esquerda, copie-o para o lugar do 3.
continuar até que 1,2 se tenham cruzado, aparar a matriz pelo número de cópias.
idealmente, é exatamente 1/2 de"separação de bolhas" :-) se, ao invés de copiar, você fizer uma troca, a saída será uma matriz parcialmente ordenada (todos os 3 terços movidos para a direita)
Mais refinamento:
Desculpe, dizem que você é um bom comerciante, mas um programador... ainda pior do que eu.
1. A variável interna inteira não é inicializada, portanto será zero, mas não é garantida. No loop, o deslocamento para trás não acontecerá (a primeira vez) por duas razões ao mesmo tempo - adivinhe qual delas.
2. (mais importante) você primeiro desloca os elementos da matriz, depois aumenta o valor da variável eliminada, e então haverá um loop e o próximo turno acontecerá mais um do que o necessário. Em outras palavras, seu código irá avalanche a matriz original.
Não há elementos extras na matriz:
A matriz tem todos os elementos desnecessários:
Desculpe, dizem que você é um bom comerciante, mas um programador... ainda pior do que eu.
Alexei, você está matando um jovem talento...
este comerciante não consegue começar a vender há 5 anos...e você diz que ele é ainda pior como programador :-)