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

 
Sergey Dzyublik:
Essentiellement, vous utilisez une structure de données statique HashSet avec un tableau initial de données pour résoudre les collisions.
Mais la mise en œuvre est juste révélatrice...

Au lieu d'appeler une fonction ("FindValueInSortArray") avec 100-500 paramètres inutiles, on utilise généralement une classe où ces paramètres agissent comme des champs de la classe (gain sur le passage des paramètres, si le compilateur n'a pas pensé à faire de l'implicite en ligne).
S'il est nécessaire d'utiliser une paire de tableaux de même taille et ayant le même but d'utilisation ( int p1[] ; int p2[] ;), on utilise généralement un tableau de structure (avantage d'accès à l'index, moins de risque de manque de cache).

Oui, je sais. Je suis d'accord, j'ai moi-même peur de ma propre mise en œuvre. Mais mon objectif est l'algorithme, pas la mise en œuvre. Comme on dit - "assemblé à genoux" (environ une heure et demie), pour vérifier l'exactitude et la rapidité de l'algorithme. Rappelez-vous que ce fil de discussion porte sur (et je cite) "la façon la plus rapide de vider un tableau de valeurs inutiles".

Bien que j'aie beaucoup à me plaindre de mon propre algorithme, car il est loin d'être universel. Je vois des moyens d'améliorer l'algorithme, mais le code deviendra beaucoup plus complexe. Dommage pour l'heure.

ZZY HashSet a d'abord entendu, parce que je ne suis pas fort en théorie. Je suis bien conscient que je n'ai rien inventé de nouveau et que tout a été inventé avant moi. :)) L'avantage de cet algorithme est évident lorsque le tableau des éléments à supprimer a une distribution uniforme. Si la distribution est très différente de l'uniforme, cette implémentation peut être inférieure en vitesse à d'autres qui existent déjà dans cette branche.

 
Taras Slobodyanik:

a changé le calcul du montant en CRC32 )

Merci. Bien sûr, c'est plus correct.

Mais d'après ce que j'ai compris, le passage au CRC32 n'a révélé aucune erreur. :)

 

Laissez-moi vous dire que je suis personnellement impressionné par les capacités des ordinateurs modernes et de MQL5 en particulier.

Après tout, il ne faut que 1/40 secondes( !!!) pour rechercher un millier de valeurs différentes dans un tableau d'un million d'éléments, les supprimer (environ 100 000 cellules) et reconditionner le tableau nettoyé.

 
optimisé
Dossiers :
 
nicholi shen :

C'est très simple ! :))

Mais, cependant, cet algorithme consomme de la mémoire de manière incontrôlée.

Ainsi, par exemple, si vous remplacez

arr[i]= rand ()% 10000 ;
....
Value2[i]= rand ()% 10000 ;

avec .

arr[i]= rand ()* rand ();
....
Value2[i]= rand ()* rand ();

la situation est complètement différente :

2018.11 . 19 23 : 25 : 57.593 ArrayDeleteValue21 (NZDUSD,D1)  вариант nicholi shen: Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -  603551 микросекунд
2018.11 . 19 23 : 25 : 57.980 ArrayDeleteValue21 (NZDUSD,D1)  вариант Nikitin     : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -  383847 микросекунд
2018.11 . 19 23 : 25 : 58.043 ArrayDeleteValue21 (NZDUSD,D1)  вариант fan9        : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -   61414 микросекунд
2018.11 . 19 23 : 25 : 58.074 ArrayDeleteValue21 (NZDUSD,D1)  вариант Semko       : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -   28430 микросекунд
Dossiers :
 
Ajouté ArrayDeleteValue à quelques personnes supplémentaires dans le projet, droits d'édition. Que j'ai manqué auparavant.
 
Nikolai Semko:

Merci. C'est certainement la bonne voie à suivre.

Mais d'après ce que j'ai compris, le passage au CRC32 n'a révélé aucune erreur. :)

Oui, mais maintenant ceux qui ont vu de leurs propres yeux le résultat d'un seul algorithme, peuvent s'assurer que d'autres obtiennent le même résultat).

 
Veuillez écrire sur le sujet. Pas de bavures ni de jurons. Merci.
 
nicholi shen:

Ce n'est pas une mauvaise idée, mais s'il y a des valeurs négatives dans un tableau ou un vecteur, vous obtiendrez une erreur de type "array out of range".

En outre, la taille d'un tableau avec des drapeaux de filtrage peut atteindre2 147 483 647, ce qui est excessif.

Bien sûr, vous pouvez réduire la taille de 32 fois en remplaçant le paramétrage de 32 variables BOOL par un masque de bits comme ceci :

int array_filter(int &a[],const int &b[]) //nicholishen
{
   int e=ArraySize(a);
   int c[];
   int d =b[ArrayMaximum(b)]+1;
   ArrayResize(c, b[ArrayMaximum(b)]/32 + 1);
   ArrayInitialize(c, 0);
   int i=0;
   int ii=0;
   while(i<ArraySize(b))
   {     
     ii=b[i]/32;
     c[ii]|=(1<<(b[i]-(ii*32)));
     i++; 
   } 
   
   int g=0, h=0, f=0;
   for(g=0; g<e; g++){
      f = a[g];
      ii=f/32;
      if(f >= d || !(c[ii] & (1<<(f-(ii*32)))) )
      {
         a[h]=f;
         h++;
      }
   }
   return ArrayResize(a, h);
}


mais il serait toujours trop gros et la vitesse diminuerait de moitié.

 
Nikolai Semko:

C'est très simple ! :))

Mais, cependant, cet algorithme consomme de la mémoire de manière incontrôlée.

Ainsi, par exemple, si vous remplacez

avec .

la situation est tout à fait différente :

Votre version est également bonne, mais malheureusement vous avez aussi un point faible. Dans des conditions "domestiques", c'est-à-dire de petits réseaux de taille ~100 et de petits vecteurs ~5-10

votre algorithme sera plus lent que tous ceux présentés ici, bien que la différence en microsecondes soit si insignifiante qu'elle n'a probablement pas d'importance, mais sur des tableaux plus grands, c'est le meilleur.

P.S Je pense que cette fonction devrait être universelle, il est nécessaire d'y combiner quelques algorithmes différents choisis en fonction des données d'entrée.