Limpar um conjunto de elementos definidos - página 3

 
Vladimir Pastushak:

A tarefa principal é limpar o conjunto de valores definidos.

Esta não pode ser a tarefa principal. O que é coletado nesta matriz e como é então utilizado?

 
Stanislav Korotky:

Bem, isso não é sério. Se puxando elefantes para resolver este pequeno problema particular, eu mencionaria STL::remove(array, valor).

Isso é apenas muito sério e fundamental. MQL é apenas verboso. Terrivelmente.

Operadores fundamentais como filtro (que em TC é ele, filtragem), mapa (mapeamento), dobra (colapso, sumarização)
deve ser implementado de imediato, sem perguntas. E ser otimizado.

 
Maxim Kuznetsov:

Isto é apenas muito sério e fundamental. MQL é apenas verboso. É horrível.

Operadores fundamentais como filtro (que no TC é filtragem), mapa (mapeamento), dobra (soma)
devem ser implementados imediatamente, sem nenhuma dúvida. E ser otimizado.

A questão é que puxar uma dependência tão gorda ("fundamental") para uma pequena tarefa é um disparate. Se escrever tudo sabiamente e refatorar todo o projeto - então, claro, mas não é a essência da pergunta original.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Limpeza de uma matriz a partir de Elementos Especificados

Dmitry Fedoseev, 2018.11.12 23:05

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


Isto é algum tipo de vergonha...©

1. A comparação das variáveis do tipo duplo via ==, para dizer de forma branda, não é cômica;
2. A complexidade do código é O(n^2), e a pior complexidade para este problema com uma seqüência de entrada não classificada deve ser O(n);
3. O código não funciona, porque quando a função é realmente utilizada, é impossível determinar quantos valores válidos a matriz retornada contém:

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


int OnStart(){
   double arr[] = {3, 5, 5, 3, 3, 5, 5, 3};
   double v = 3;
   
   ArrayPrint(arr);
   DelEl(arr, v);
   ArrayPrint(arr);
   
   return INIT_SUCCEEDED;
}


Resultado da execução:

2018.11.13 00:35:33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11.13 00:37:08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

Os valores inválidos são destacados em vermelho, eles nunca foram removidos da matriz.

 
Sergey Dzyublik:


Isto é algum tipo de vergonha...©

1. Não é agradável comparar variáveis do tipo duplo via ==, para dizer de forma branda;
2. A complexidade do código é O(n^2), e o pior caso de complexidade para este problema com uma seqüência de entrada não classificada deve ser O(n);
3. O código não funciona, porque quando a função é realmente utilizada, é impossível determinar quantos valores válidos a matriz retornada contém:


Resultado da execução:

Os valores inválidos que nunca foram removidos da matriz são destacados em vermelho.

Jublik? Que assim seja. A comparação de variáveis do tipo duplo é bastante cômica se elas não forem calculadas antes da comparação.

Aprenda a matemática. E a vergonha?

 
Sergey Dzyublik:


Isto é algum tipo de vergonha...©

1. A comparação das variáveis do tipo duplo com == é, para dizer de forma suave, não cômica;
2. A complexidade do código é O(n^2), e a pior complexidade para este problema com seqüência de entrada não classificada deve ser O(n);
3. O código não funciona, porque quando a função é realmente utilizada, é impossível determinar quantos valores válidos a matriz retornada contém:


Resultado da execução:

Os valores inválidos que nunca foram removidos da matriz são destacados em vermelho.

Não seja absurdo. Devo explicar-lhe seu erro, ou você mesmo pode adivinhá-lo? Não é nada difícil...

Três pontos, três currais. Na verdade, não, apenas dois paddocks.

ps, mas eu tenho fé em você.

ps2 aqui está o resultado, se você usar a função corretamente:


 

Assim é melhor:

void DelEl2(double & a[],double v){
   int sz=ArraySize(a);
   int i=0;   
   int j=0;
   for(;i<sz;i++){ 
      if(a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize(a,j);
}
 
Dmitry Fedoseev:

Assim é melhor:

Dimitri, deixe-me aborrecê-lo - v também é uma matriz.

E de qualquer forma, tudo isso é um monte de bobagens.

 
Алексей Тарабанов:

Dimitri, deixe-me aborrecê-lo - v também é uma matriz.

E em geral, tudo isso é um total absurdo.

Se v é uma matriz, não é um problema. Mas o fato de que é um disparate é mais provável. Eu nunca senti a necessidade de resolver esta tarefa.

 

Se for um concurso de velocidade, oferecerei também minha própria variante:

int ArrayDeleteVal(int &a[],const int val) // вариант Semko
  {
   int size=ArraySize(a);
   int i=0,start,s,count;
   while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   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 элементов, то имеет смысл воспользоваться ArrayCopy
      else for(; s<i; start++,s++) a[start]=a[s];                // иначе простой цикл
      if(i==size) break;
      i++;
      while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
      if(i<size) s=i; else break;
      i++;
     }
   if(start<size) ArrayResize(a,start); else start=size;
   return(start);
  }

Eu escrevi um roteiro de teste para todas as variantes.
Aqui está o resultado para um conjunto de 1 000 000 de elementos (cerca de 1000 valores extras):

2018.11.12 19:50:02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.12 19:50:02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.12 19:50:02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.12 19:50:02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
Quem é o próximo? :))
Peter, Awwww....
Arquivos anexados: