Algoritmos, métodos de solución, comparación de su rendimiento - página 11

 
Artyom Trishkin:

Los demás hasta ahora sólo tenemos la audacia de reírnos y señalar con el dedo.

¿En serio? He aquí un punto de vista alternativo.

Un hombre entró en un hilo en el que no tenía ni idea, e inmediatamente se le pidió que lo dejara y se lo llevó a su terreno favorito.

acabó pasando a otra rama y se encontró con un problema incomprensible que no tiene nada que ver con los genéricos que se discuten en esa rama ni con la práctica.

Ni siquiera respondió a los intentos de señalar los errores con tonterías.

No es la primera vez que lo hace.

Oh, pobre bastardo.

¿Quizá usted también es de los que buscan por ordenación de matrices y no entiende lo que pasa?

 
Комбинатор:

¿En serio? He aquí un punto de vista alternativo.

Un hombre llegó a un hilo del que no tenía ni idea, e inmediatamente le pidieron que lo dejara, y se lo llevó a su afición favorita.

acabó pasando a otra rama y se encontró con un problema incomprensible que no tiene nada que ver con los genéricos que se discuten en esa rama ni con la práctica.

Ni siquiera respondió a los intentos de señalar los errores con tonterías.

No es la primera vez que lo hace.

Oh, pobre bastardo.

¿Quizá usted también es de los que buscan por ordenación de matrices y no entiende lo que pasa?


Hace mucho tiempo aprendí a programar, y entonces descubrí que había libros de texto sobre programación. Lo mismo ocurrió con el dominio de la POO y otras cosas.

Aun así, un hecho es un hecho. Nadie dio un ejemplo.

Dos ejemplos con y sin uso de hojas (es decir, sin clases).

Por supuesto, sin ningún uso de la matriz de cadenas (esto es para la variante sin la clase).

 

Bueno, la cuestión de la ordenación es siempre relevante - ¿hay opciones para una ordenación más rápida que la función estándar y, en general, cuál es el código? .... por lo que recuerdo hay diferentes formas de ordenación dependiendo del tamaño del array a ordenar - y la posibilidad de utilizar memoria adicional para acelerar

 

Sería interesante ver los algoritmos que mejor funcionan en números, al menos en términos de tiempo de ejecución.

Hasta ahora, parece que defendemos nuestra versión como la mejor.

Sin embargo, los criterios para esta autoevaluación no están claros.

 
Комбинатор:

¿En serio? He aquí un punto de vista alternativo.

Un hombre llegó a un hilo sobre el que no tenía ni idea, e inmediatamente se le pidió que lo dejara, y lo llevó a su tema favorito.

acabó pasando a otra rama y se encontró con un problema incomprensible que no tiene nada que ver con los genéricos que se discuten en esa rama ni con la práctica.

Ni siquiera respondió a los intentos de señalar los errores con tonterías.

No esla primera vez que lo hace.

Oh, pobre bastardo.

¿Tal vez usted también es el tipo de persona que clasifica al máximo las matrices y no entiende lo que está pasando?

Sí, estoy de acuerdo... Era de esperar, pero lo que yo quería de Pedro era muy diferente (si intentas analizar lo que le ofrecí, mi objetivo quedará claro)

Y estoy de acuerdo con eso. Pero el hilo se creó con un propósito diferente: mostrar, discutir.

Pero no para reírse. ¿Qué tiene que ver eso con ofenderse? Es una farsa. Primero fue Peter el que empezó en casa de Vasily, yo le pedí que viniera aquí para discutir tranquilamente, y no sólo en casa de Peter. La idea era diferente: no burlarse de los conceptos erróneos, sino contar, explicar... Y, lo que es más interesante, tratar de idear algoritmos interesantes. ¿Lo entiendes? ¿No?

:))) Por supuesto. No lo sé :)))

 
Renat Akhtyamov:

Sería interesante ver los algoritmos que mejor funcionan en números, al menos en términos de tiempo de ejecución.

Hasta ahora parece que todo consiste en defender la propia versión como la mejor.

Sin embargo, los criterios de dicha autoevaluación no están claros.

Creo que a mucha gente le interesaría.

Pues bien, todo el mundo sabe que Pedro, empecinado en su ego, demuestra su extrañeza, y todo el mundo está harto de ello.

Personalmente, me gustaría que Peter dirigiera su perseverancia en otra dirección: no para montar un huerto, sino para entender lo que se le ofrece.

 
Artyom Trishkin:

Creo que a mucha gente le interesaría.

Bueno, el hecho de que Peter, mirando a su propio yo, demuestra la extrañeza - todo el mundo sabe aquí, y todo el mundo está harto.

Personalmente, me gustaría que Peter dirigiera su perseverancia en otra dirección: no para montar un huerto, sino para entender lo que se le ofrece.

El tiempo de funcionamiento de cualquier algoritmo es más fácil de predecir/calcular conociendo el tiempo de ejecución de la función, por ejemplo, repitiéndola 10 000 veces.

Pero no me he encontrado con el problema de no completar el código hasta el final, por muy complicado que sea.

Como se dice, ¡bravo MQL!
 
Artyom Trishkin:

Creo que a mucha gente le interesaría.

Pues bien, el hecho de que Pedro, obstinado en su propio ser, demuestre la extrañeza -aquí todo el mundo lo sabe, y todo el mundo está ya harto-.

Personalmente, me gustaría que Peter dirigiera su perseverancia en otra dirección: no para iniciar un huerto, sino para entender lo que se le ofrece.

Nadie está en contra de ayudar y explicar, etc. Pero Pedro en tantos hilos reduce todo a lo mismo que no hay ganas de explicar y ayudar.
 
Alexey Oreshkin:
Nadie está en contra de ayudar y explicar, etc. Pero Pedro en tantos hilos está reduciendo todo a lo mismo, que no hay ganas de explicar y ayudar.

 
Artyom Trishkin:

Hasta ahora todo lo que veo aquí es una burla al hombre que tuvo la audacia de publicar su solución aquí.

Obviamente, es... por decirlo suavemente, es un chiste, como mínimo. Pero lo hizo. El resto sólo tiene hasta ahora el valor de reírse y señalar con el dedo.


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