Algorithmes, méthodes de résolution, comparaison de leurs performances - page 11

 
Artyom Trishkin:

Le reste d'entre nous n'a jusqu'à présent que l'audace de rire et de montrer du doigt.

Vraiment ? Voici un autre point de vue.

Un homme est arrivé sur un fil dont il n'avait aucune idée, et on lui a immédiatement demandé de le laisser, et il en a fait tout un plat, le traînant sur son gazon préféré.

il a fini par passer à une autre branche et a rencontré un problème incompréhensible qui n'a rien à voir avec les génériques discutés dans cette branche ou avec la pratique.

Il n'a même pas répondu aux tentatives de signaler des erreurs par des absurdités.

Ce n'est pas la première fois qu'il le fait.

Oh, pauvre bâtard.

Peut-être faites-vous également partie de ceux qui font des recherches par tri de tableaux et ne comprennent pas ce qui se passe ?

 
Комбинатор:

Sérieusement ? Voici un autre point de vue.

Un homme est arrivé sur un fil dont il n'avait aucune idée, et on lui a immédiatement demandé de le quitter, et il l'a repris pour son sujet préféré.

il a fini par passer à une autre branche et a rencontré un problème incompréhensible qui n'a rien à voir avec les génériques discutés dans cette branche ou avec la pratique.

En fait, il n'a pas résolu le problème. De plus, il délire lorsqu'il essaie de signaler des erreurs.

Ce n'est pas la première fois qu'il le fait.

Oh, pauvre bâtard.

Peut-être faites-vous également partie de ceux qui font des recherches par tri de tableaux et ne comprennent pas ce qui se passe ?


Vous savez, il y a longtemps, j'ai appris à programmer - et puis j'ai découvert qu'il existait des manuels de programmation. C'était la même chose avec la maîtrise de la POO et d'autres choses.

Mais un fait est un fait. Personne n'a donné d'exemple.

Deux exemples avec et sans utilisation de feuilles (c'est-à-dire sans classes).

Bien sûr, sans aucune utilisation du tableau de chaînes de caractères (ceci est pour la variante sans la classe).

 

la question du tri est toujours pertinente - existe-t-il des options pour un tri plus rapide que la fonction standard et, en général, quel est le code ? .... si je me souviens bien, il existe différentes façons de trier en fonction de la taille du tableau à trier - et la possibilité d'utiliser de la mémoire supplémentaire pour accélérer.

 

Il serait intéressant de voir les algorithmes les plus performants en chiffres, au moins en termes de temps d'exécution.

Jusqu'à présent, il semble que nous défendions notre version comme étant la meilleure.

Toutefois, les critères de cette auto-évaluation ne sont pas clairs.

 
Комбинатор:

Sérieusement ? Voici un autre point de vue.

Un homme est arrivé sur un fil dont il n'avait aucune idée, et on lui a immédiatement demandé de le quitter, ce qu'il a fait pour son passe-temps favori.

il a fini par passer à une autre branche et a rencontré un problème incompréhensible qui n'a rien à voir avec les génériques discutés dans cette branche ou avec la pratique.

Il n'a même pas répondu aux tentatives de signaler des erreurs par des absurdités.

Cen'est pas la première fois qu'il le fait.

Oh, pauvre bâtard.

Peut-être êtes-vous aussi le genre de personne qui fait un maximum de tri de tableaux et qui ne comprend pas ce qui se passe ?

Oui, je suis d'accord... C'était attendu, mais ce que je voulais de Peter était tout à fait différent (si vous essayez d'analyser ce que je lui ai proposé, mon objectif sera clair)

Et je suis d'accord avec ça. Mais ce fil de discussion a été créé dans un but différent - pour montrer, pour discuter.

Mais pas pour rire. Qu'est-ce que ça a à voir avec le fait d'être offensé ? C'est une farce. C'est d'abord Peter qui a commencé chez Vasily, je lui ai demandé ici une discussion tranquille, et pas seulement celle de Peter. L'idée était différente : il ne s'agissait pas de se moquer des idées fausses, mais de raconter, d'expliquer... Et, ce qui est encore plus intéressant, d'essayer de trouver des algorithmes intéressants. Vous comprenez ? Non ?

:))) Bien sûr. Je n'en sais rien :))))

 
Renat Akhtyamov:

Il serait intéressant de voir les algorithmes les plus performants en chiffres, au moins en termes de temps d'exécution.

Jusqu'à présent, il semble qu'il s'agisse de défendre sa propre version comme étant la meilleure.

Cependant, les critères de cette estime de soi ne sont pas clairs.

Voilà - je pense que beaucoup de gens seraient intéressés par ça.

Eh bien, tout le monde sait que Pierre, obstinément dans son ego, prouve l'étrangeté - et tout le monde en a assez.

Personnellement, j'aimerais que Peter oriente son obstination dans une autre direction - non pas pour créer un potager, mais pour comprendre ce qu'on lui propose.

 
Artyom Trishkin:

Voilà - je pense que beaucoup de gens seraient intéressés par ça.

Le fait que Pierre, en se regardant fixement, prouve son étrangeté - tout le monde le sait ici, et tout le monde en a marre.

Personnellement, j'aimerais que Peter dirige sa persévérance dans une autre direction - non pas pour commencer un potager, mais pour comprendre ce qu'on lui propose.

Il est plus facile de prédire/calculer le temps passé à faire fonctionner un algorithme en connaissant le temps d'exécution de la fonction, par exemple en la répétant 10 000 fois.

Mais je n'ai pas rencontré le problème de ne pas terminer le code jusqu'au bout, quelle que soit sa complexité.

Comme on dit - bravo MQL !
 
Artyom Trishkin:

Voilà - je pense que beaucoup de gens seraient intéressés par ça.

Eh bien, le fait que Pierre, entêté dans sa propre personne, prouve l'étrangeté - tout le monde le sait ici, et tout le monde en a déjà marre.

Personnellement, j'aimerais que Peter dirige sa persévérance dans une autre direction - non pas pour commencer un potager, mais pour comprendre ce qui lui est proposé.

Personne n'est contre le fait d'aider et d'expliquer, etc. Mais Peter, dans tellement de fils de discussion, réduit tout à la même chose qu'il n'y a aucune volonté d'expliquer et d'aider.
 
Alexey Oreshkin:
Personne n'est contre le fait d'aider et d'expliquer, etc. Mais Peter, dans tant de fils, réduit tout à la même chose, qu'il n'y a aucune volonté d'expliquer et d'aider.

 
Artyom Trishkin:

Jusqu'à présent, je ne vois ici qu'une moquerie à l'égard de l'homme qui a eu l'audace de poster sa solution ici.

Évidemment, c'est... Le moins que l'on puisse dire, c'est que c'est une blague. Mais il l'a fait. Les autres n'ont jusqu'à présent que le courage de rire et de montrer du doigt.


#include <Generic\ArrayList.mqh>


//+------------------------------------------------------------------+
//|  Defines                                                                |
//+------------------------------------------------------------------+

#define  TEST_LOG true
      
#define  TEST_START(NAME) string TEST_START_STRING_INFO_##NAME = StringFormat("%s, Step:%s, Test was started....", __FUNCTION__, string(NAME));  \
                         if (TEST_LOG) Print(TEST_START_STRING_INFO_##NAME);                                                                                  \
                         ulong TEST_TIMER_##NAME = GetMicrosecondCount();                                                                 
                          
#define  TEST_END(NAME)   ulong TEST_DURATION##NAME = GetMicrosecondCount() - TEST_TIMER_##NAME;                                                                                \
                         string TEST_END_STRING_INFO_##NAME = StringFormat("%s, Step:%s, Test has been finished. Duration: %I64i.", __FUNCTION__, string(NAME), TEST_DURATION##NAME);  \
                         if (TEST_LOG) Print(TEST_END_STRING_INFO_##NAME);
                         
#define  TEST_DURATION(NAME)  TEST_DURATION##NAME


#define  TEST_ERROR_INVALID_VALUE(NAME) string TEST_ERROR_STRING_INFO_##NAME = StringFormat("%s, Step:%s, Getting value does not match the original one.", __FUNCTION__, string(NAME));    \
                                 if (TEST_LOG) Print(TEST_ERROR_STRING_INFO_##NAME);                                                                                                              \
                                 DebugBreak();                                                                                                                                      \
                                 break;                                                                                          
                                 
#define  TEST_ERROR_NULL_GENERATOR(NAME) string TEST_ERROR_STRING_INFO_##NAME = StringFormat("%s, Was not found correspond Generator class - %s. Please implement it.", __FUNCTION__, string(NAME));  \
                                 if (TEST_LOG) Print(TEST_ERROR_STRING_INFO_##NAME);




//+------------------------------------------------------------------+
//|   Generators                                                               |
//+------------------------------------------------------------------+

template<typename T>
interface IGenerator{
   T GetNext(int index);
};

class IntGenerator : public IGenerator<int>{
   int GetNext(int index){return index;}
};


// TODO bypass the problem with explicit template specialization
template<typename T>
IGenerator<T>* CreateGenerator(){
   string generatorName = typename(T);
   StringToUpper(generatorName);
   
   if (generatorName == "INT"){
      return new IntGenerator();
   }
    
   return NULL;
}

//template<>
//IGenerator<int>* CreateGenerator<int>(){
//   return NULL;
//};




//+------------------------------------------------------------------+
//|    TestCollection Interfaces                                                              |
//+------------------------------------------------------------------+

template<typename T>
interface ITestRandomAccessCollection{
   bool Add(T value);
   T GetValue(int index);
};



//+------------------------------------------------------------------+
//|    TestCollection Implementations                                                   |
//+------------------------------------------------------------------+

template<typename T>
class TestRandomAccessCollectionCArrayList : public ITestRandomAccessCollection<T>{
   CArrayList<T> collection;

public:
   TestRandomAccessCollectionCArrayList(){};
   TestRandomAccessCollectionCArrayList(int capacity):collection(capacity){};
   
   bool Add(T value){
      return collection.Add(value);
   };
   T GetValue(int index){
      int value = -1; 
      collection.TryGetValue(index,value); 
      return value;
   };
};




//+------------------------------------------------------------------+
//|    Test Functions                                                              |
//+------------------------------------------------------------------+

template<typename T>
ulong TestRandomAccessCollectionAfterAdding(ITestRandomAccessCollection<T> &testCollection, const int iterationCount = 1000, int srandValue = 0){
      //TODO add shared_ptr / move out generator (Dependency Injection)
      IGenerator<T>* generator = CreateGenerator<T>();
      if (generator == NULL){
TEST_ERROR_NULL_GENERATOR("FirstGenerator")
         return 0;
      }

      if (srandValue == 0)
         srandValue = int(TimeCurrent());
         
      T validationArray [];
      ArrayResize(validationArray,iterationCount);
      

      for(int i = 0; i < iterationCount; i++){
         T value = generator.GetNext(rand());
         testCollection.Add(value);
         validationArray[i] = value;
      }
      
TEST_START ("GetValue")
      for(int i = 0; i < iterationCount; i++){
         int index = rand() % iterationCount;
         
         T value = testCollection.GetValue(index);
         T originalValue = validationArray[index];
         if (value != originalValue){
TEST_ERROR_INVALID_VALUE("Validate")
         }
      }
TEST_END ("GetValue")
      return TEST_DURATION("GetValue");
}




int OnInit()
{
  ulong result;
  
  // TODO average result
  {
     printf ("TestRandomAccessCollectionAfterAdding: Started.", result);
     TestRandomAccessCollectionCArrayList<int> testCollection();
     result = TestRandomAccessCollectionAfterAdding(testCollection, 10000, 1);
     printf ("TestRandomAccessCollectionAfterAdding: Fineshed. Total result: %I64i\n", result);
  }
  
  
  //TestArrayListRandomAccessDuringAdding(10000);
  return INIT_FAILED;
}