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

 
Nikolai Semko:
Par essence, tous les algorithmes sont les mêmes. Tout le monde modifie le tableau élément par élément, et tout le monde s'efforce d'obtenir la variante de Fedoseev, car elle ne comporte rien d'inutile.
Seulement dans mon cas, cela se fait par blocs en utilisant ArrayCopy, donc il y a un avantage de vitesse.

Et pour Pyotr ? Est-ce que tout le monde s'est "déchiré" ? Personne n'a mis son code dans le vérificateur. Je me demande comment, et dans quelle mesure, il a épaté tout le monde au conseil.

 
Vladimir:

J'ai réfléchi aux raisons et j'ai corrigé deux lignes pour supprimer un tiers des éléments, et non 0,1 %.

Conclusion : calculer des adresses dans un tableau avec une distance arbitraire entre leurs numéros est toujours pire que de traiter des éléments dans une rangée à une étape donnée, d'autant plus à l'étape 1, le compilateur peut l'optimiser.

Oh, je vois ce que vous voulez dire. Cette phrase m'a échappé
Oui, bien sûr, c'est clair, mais quand même, même lorsque je dois jeter un élément sur trois (alors ArrayCopy ne fonctionne plus pour moi et les gains disparaissent) l'image est différente :

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

La variante de Pavlov ne fonctionne pas vraiment, mais vous avez aussi des sommes de contrôle correctes et incorrectes.

Dossiers :
 
Artyom Trishkin:

Et qu'en est-il de Peter ? Tu les as tous déchirés ? Personne n'a inséré son code dans le vérificateur. C'est intéressant de voir comment et dans quelle mesure il a épaté tout le monde au conseil d'administration.

Je ne comprends toujours pas son délire. Il n'a toujours pas fourni de fonction toute faite. Et si je le termine pour lui, il m'accusera encore de tout refaire. ))

 
Nikolai Semko:

Je ne comprends toujours pas son délire. Il n'a toujours pas fourni de fonction toute faite. Et si je le termine pour lui, il m'accusera encore de tout refaire. ))

En regardant son code depuis un téléphone portable, j'ai eu l'impression qu'il écrivait de manière "directe". C'est pour ça qu'il n'a pas fourni la fonction - il fait tout à la suite. Et son script n'est pas une fonction mais un simple code. Bien sûr, un tel script peut ne pas impliquer une fonction, mais... Je pense qu'il manque de goto pour ses vols :)

Mais c'est juste mon sentiment.

 
Nikolai Semko:

Correction de la variante de Pavlov.
Vos valeurs sont étranges. Peut-être avez-vous exécuté le script après le profilage ou le débogage sans recompiler le code ?
C'est comme ça que ça marche pour moi :

Et dans votre variante, il donne une somme de contrôle erronée. La création d'un tableau supplémentaire n'est pas du tout rentable, au contraire, elle ralentit le processus et consomme des ressources supplémentaires.

Corrigé.

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

Je l'ai lancé plusieurs fois, les résultats sont en suspens - l'ordinateur est très occupé, il ne sera pas libre avant samedi. Mieux vaut vérifier avec quelqu'un d'autre. Mais la somme de contrôle correspond maintenant. Pour les valeurs inutiles très éparses (0,1%)

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) option Pastushak : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 418662 microsecondes
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variant Korotky : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 10683 microsecondes
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variant Fedoseev : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 9740 microsecondes
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variant Semko : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 4691 microsecondes
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variant Pavlov : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 12512 microsecondes
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variant Nikitin : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 10720 microsecondes
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variante Vladimir : Somme de contrôle = 497057781 ; éléments - 998984 ; temps d'exécution = 17197 microsecondes

pour un tiers

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variante Pastushak : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 65732 microsecondes
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variant Korotky : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 4757 microsecondes
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variant Fedoseev : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 4815 microsecondes
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Semko : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 5812 microsecondes
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Pavlov : Somme de contrôle = 1001157 ; éléments - 667065 ; temps d'exécution = 0 microsecondes
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Nikitin : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 4749 microsecondes
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variante Vladimir : Somme de contrôle = 668222 ; éléments - 667065 ; temps d'exécution = 9814 microsecondes
Pavlov s'est encore planté.

Ma conclusion sur l'accélération des boucles for est probablement incorrecte pour les langages MQL.

Et la création d'un tableau supplémentaire devrait réduire la durée de la transaction elle-même en supprimant les superflus, en gardant le tableau inchangé jusqu'au moment nécessaire de son démarrage. Jusqu'à présent, il n'a pas été question de préservation des données ici.

 
Artyom Trishkin:

Et pour Peter ? A-t-il "déchiré" tout le monde ? Personne n'a mis son code dans le vérificateur. Je me demande comment, et dans quelle mesure, il a épaté tout le monde au conseil.

Mais j'ai réussi à mettre la main sur la version 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);
  }

Il est assez compact et fonctionne même correctement. Félicitations à Pyotr.
Mais en termes de vitesse, il est le deuxième en partant de la fin. Ou la première place depuis la fin si on ne compte pas la version originale, complètement inadaptée à la vitesse, du propriétaire de ce fil.

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

:-) si vous n'essayez pas de garder l'ordre, le temps est O(1) , le nombre total d'étapes de toutes les boucles= taille du tableau.

trop paresseux pour coder :-)

1. rechercher les 3 premiers de gauche à droite.

2. Si elle est trouvée, cherchez alors un non-trois de droite à gauche, copiez-le à la place du 3.

continuer jusqu'à ce que 1,2 se soient intersectés, découper le tableau par le nombre de copies.

idéalement, c'est exactement la moitié du"tri à bulles" :-) si, au lieu de copier, vous faites un échange, le résultat sera un tableau partiellement ordonné (les 3 tiers sont déplacés vers la droite).

 
Реter Konow:

Plus de raffinement :

Désolé, on dit que vous êtes un bon marketeur, mais un programmeur... encore pire que moi.

1. La variable interne entière supprimée n'est pas initialisée, elle sera donc égale à zéro, mais ce n'est pas garanti. Dans la boucle, le décalage vers l'arrière ne se fera pas (la première fois) pour deux raisons à la fois - devinez laquelle.

2. (le plus important) vous déplacez d'abord les éléments du tableau, puis vous augmentez la valeur de la variable supprimée, et ensuite il y aura une boucle et le prochain déplacement se fera une fois de plus que nécessaire. En d'autres termes, votre code avalera le tableau original.

 
Options extrêmes :
Il n'y a pas d'éléments supplémentaires dans le tableau :
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 микросекунд
Le tableau contient tous les éléments inutiles :
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 микросекунд
Dossiers :
 
Алексей Тарабанов:

Désolé, on dit que vous êtes un bon marketeur, mais un programmeur... encore pire que moi.


Alexei, tu es en train de tuer un jeune talent...

ce marketeur n'a pas été capable de commencer à vendre pendant 5 ans... et vous dites qu'il est encore pire comme programmeur :-)

Raison: