Effacement d'un tableau d'élément(s) défini(s) - page 3

 
Vladimir Pastushak:

La tâche principale consiste à effacer le tableau des valeurs définies.

Cela ne peut pas être la tâche principale. Qu'est-ce qui est collecté dans ce tableau et comment est-il ensuite utilisé ?

 
Stanislav Korotky:

Ce n'est pas sérieux. Si je devais tirer des éléphants pour résoudre ce petit problème particulier, je mentionnerais STL::remove(array, value).

C'est tout simplement très sérieux et fondamental. MQL est juste verbeux. Terriblement.

Opérateurs fondamentaux tels que filter (qu'est-ce que c'est dans TC, filtrer), map (cartographie), fold (collationner, résumer)
devrait être mis en œuvre immédiatement, sans poser de questions. Et être optimisé.

 
Maxim Kuznetsov:

C'est tout simplement très sérieux et fondamental. MQL est juste verbeux. C'est horrible.

Des opérateurs aussi fondamentaux que filter (qui, dans TC, est un filtrage), map (mappage), fold (sommation)
devraient être implémentés immédiatement, sans aucune question. Et être optimisé.

Le fait est qu'il est absurde de faire appel à une dépendance aussi importante ("fondamentale") pour une petite tâche. S'il s'agit de tout écrire sagement et de refactoriser l'ensemble du projet - alors, bien sûr, mais ce n'est pas l'essence de la question initiale.

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Nettoyage d'un tableau à partir d'éléments spécifiés

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);
}


C'est une sorte de honte...©

1. Comparer des variables de type double via == n'a rien de comique ;
2. La complexité du code est O(n^2), et la pire complexité pour ce problème avec une séquence d'entrée non triée devrait être O(n) ;
3. Le code ne fonctionne pas, car lorsque la fonction est réellement utilisée, il est impossible de déterminer combien de valeurs valides le tableau retourné contient :

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;
}


Résultat de l'exécution :

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

Les valeurs invalides sont surlignées en rouge, elles n'ont jamais été retirées du tableau.

 
Sergey Dzyublik:


C'est une sorte de honte...©

1. Il n'est pas agréable de comparer des variables de type double via ==, pour ne pas dire plus ;
2. La complexité du code est O(n^2), et la complexité du pire cas pour ce problème avec une séquence d'entrée non triée devrait être O(n) ;
3. Le code ne fonctionne pas, car lorsque la fonction est réellement utilisée, il est impossible de déterminer combien de valeurs valides le tableau retourné contient :


Résultat de l'exécution :

Les valeurs invalides qui n'ont jamais été retirées du tableau sont mises en évidence en rouge.

Jublik ? Ainsi soit-il. La comparaison de variables de type double est assez comique si elles ne sont pas calculées avant la comparaison.

Apprenez les mathématiques. Et la honte ?

 
Sergey Dzyublik:


C'est une sorte de honte...©

1. Comparer des variables de type double avec == n'est, pour le moins, pas comique ;
2. La complexité du code est O(n^2), et la pire complexité pour ce problème avec une séquence d'entrée non triée devrait être O(n) ;
3. Le code ne fonctionne pas, car lorsque la fonction est réellement utilisée, il est impossible de déterminer combien de valeurs valides le tableau retourné contient :


Résultat de l'exécution :

Les valeurs invalides qui n'ont jamais été retirées du tableau sont mises en évidence en rouge.

Ne soyez pas absurde. Dois-je vous expliquer votre erreur, ou pouvez-vous la deviner vous-même ? Pas difficile du tout...

Trois points, trois corrals. En fait, non, seulement deux paddocks.

ps, mais j'ai foi en vous.

ps2 voici le résultat si vous utilisez la fonction correctement :


 

C'est mieux :

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:

C'est mieux :

Dimitri, laisse-moi te contrarier - v est aussi un tableau.

Et de toute façon, c'est un tas d'idioties.

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

Dimitri, laisse-moi te contrarier - v est aussi un tableau.

Et en général, tout cela est une absurdité totale.

Si v est un tableau, ce n'est pas un problème. Mais le fait que ce soit un non-sens est plus probable. Je n'ai jamais ressenti le besoin de résoudre cette tâche.

 

Si c'est un concours de vitesse, je proposerai également ma propre 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);
  }

J'ai écrit un script de test pour toutes les variantes.
Voici le résultat pour un tableau de 1 000 000 d'éléments (environ 1000 valeurs supplémentaires) :

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 микросекунд
Qui est le prochain ? :))
Peter, Awww....
Dossiers :