Limpar um conjunto de elementos definidos - página 24

 

Aqui está a melhor versão, usando a busca binária.

#include <Arrays\ArrayInt.mqh>
int array_filter(int &arr[], const int &filters[])
{
   int size_arr = ArraySize(arr);
   CArrayInt filterz;
   filterz.AssignArray(filters);
   filterz.Sort();
   int i=0, k=0;
   for(i=0; i<size_arr; i++)
      if(filterz.Search(arr[i]) < 0)
         arr[k++] = arr[i]; 
   return ArrayResize(arr, k); 
}


Eu não falo russo, eu uso o google translate.
 
jdjahfkahjf:

Ele não é russo, é difícil de entender. El habla espanol.

Eu me senti tentado a aprender espanhol quando estava passando por ali, mas desisti...por nada.
 
template<typename T>
int arrayFilter(T &data[], const T value)
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

template<typename T>
int arrayFilter(T &data[], const T &value[])
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          bool p = false;
          for(int y=0; y<ArraySize(value); y++)
               if( data[i] == value[y] )
               {
                    result = true;
                    s--;
                    p = true;
                    break;
               }
          if( p )
               continue;
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

Como você precisa é como você pode convocá-lo no final.

 
Konstantin Nikitin:

Como você precisa é como você pode convocá-lo no final.

uma cópia do valor[] a ser classificada ao entrar na função e

a busca binária será mais rápida, o espanhol está bem aqui.

 
Maxim Kuznetsov:

uma cópia do valor[] a ser classificada ao entrar na função e

a busca binária será mais rápida, o espanhol está certo sobre isso.

Eu não me preocupei com isso. Acabei de fazer uma rápida transferência. Sim, e pode haver matrizes de cordas.

P.S. Estou farto deste entretenimento. É hora de começar a trabalhar.
 
Maxim Kuznetsov:

uma cópia do valor[] a ser classificada ao entrar na função e

a busca binária será mais rápida, o espanhol está certo sobre isso.

Eu usaria a estrutura de dados HashSet como valor.
A complexidade seria O(n) + O(m).

Para a pesquisa binária proposta, a complexidade seria: O(n log(m))

 

24 páginas - Não entendo de onde vem o temperamento e o quanto você pode passar por uma tarefa primitiva, tirei o roteiro da terceira página, pois não há força para ler mais, acrescentei três linhas, em linha, sem funções.

N=ArraySize(arr)-1;
for(int i=N;i>=0;i--) if(arr[i]==Value) arr[i]=arr[N--]; N++;
ArrayResize(arr,N);
2018.11.17 01:44:40.077 ArrayDeleteValue (EURUSD,H1)    вариант Pastushak: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 308973 микросекунд
2018.11.17 01:44:40.092 ArrayDeleteValue (EURUSD,H1)    вариант Korotky: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11531 микросекунд
2018.11.17 01:44:40.107 ArrayDeleteValue (EURUSD,H1)    вариант Fedoseev: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11325 микросекунд
2018.11.17 01:44:40.114 ArrayDeleteValue (EURUSD,H1)    вариант Semko: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2819 микросекунд
2018.11.17 01:44:40.117 ArrayDeleteValue (EURUSD,H1)    вариант Inline: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2600 микросекунд

é estranho, mas parece que ele bateu em todos - "em cinco minutos e sem nenhum truque" (c) e foi para a cama...)

Arquivos anexados:
 
Ivan Negreshniy:

24 páginas - Não entendo de onde vem o temperamento e o quanto você pode passar por uma tarefa primitiva, tirei o roteiro da terceira página, pois não há força para ler mais, acrescentei três linhas, em linha, sem funções.

é estranho, mas parece que bati em todos - "em cinco minutos e sem truques" (c) e fui para a cama...))

1. Você pegou código de idade desconhecida, e isto é desrespeito direto à comunidade;
2. Você fez mudanças no código, codificação nagamno em algum lugar dentro, sem mesmo colocá-los em função separada;
3. Então, aparentemente, você lançou o código para testes de performance na compilação DEBUG, pois tanto a velocidade de execução quanto os resultados não correspondem à versão RELEASE.
4. Seu código contém erros e não resolve o problema de forma alguma. (Uma vez quearr[N--] pode conter umValor que não foi filtrado nem excluído).

Mas com pathos de tal "vencedor"...

 

OK. Enquanto não houver trabalho, o teste louco continua. Adicionei um novo teste vetorial e incluí a opção@Ivan Negreshniy ao mesmo tempo, veja, resolva seus erros, seu algoritmo não está funcionando.

Conseguimos isto

1

Arquivos anexados:
 

Otimização menor

P.S. corrigiu erros e substituiu o arquivo

Arquivos anexados: