Limpar um conjunto de elementos definidos - página 9

 
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.

 
Vladimir:

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

A variante de Pavlov realmente não funciona, mas você também tem o checksum correto e incorreto.

Arquivos anexados:
 
Artyom Trishkin:

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. ))

 
Nikolai Semko:

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.

 
Nikolai Semko:

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[],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);
  }

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.

 
Artyom Trishkin:

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[],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);
  }

É 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.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 микросекунд
Arquivos anexados:
 

:-) 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)

 
Реter Konow:

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.

 
Opções extremas:
Não há elementos extras na matriz:
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 микросекунд
A matriz tem todos os elementos desnecessários:
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 микросекунд
Arquivos anexados:
 
Алексей Тарабанов:

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 :-)