Algoritmos, métodos de solução, comparação de seu desempenho - página 11

 
Artyom Trishkin:

O resto de nós, até agora, temos apenas a audácia de rir e apontar o dedo.

A sério? aqui está um ponto de vista alternativo.

Um homem chegou a um fio sobre o qual não tinha idéia, e foi imediatamente solicitado a deixá-lo, e ele fez uma bagunça, arrastando-o para seu território favorito.

ele acabou se mudando para um ramo separado e surgiu um problema incompreensível que não tem nada a ver com os genéricos que estão sendo discutidos naquele ramo ou com a prática.

Ele nem mesmo respondeu às tentativas de apontar erros com bobagens.

Esta não é a primeira vez que ele o faz.

Oh, pobre coitado.

Talvez você também seja um daqueles que pesquisam por classificação por matriz e não entendem o que está acontecendo?

 
Комбинатор:

A sério? aqui está um ponto de vista alternativo.

Um homem chegou a um fio sobre o qual não tinha idéia, e foi imediatamente solicitado a deixá-lo, e ele o levou para seu assunto favorito.

ele acabou se mudando para um ramo separado e surgiu um problema incompreensível que não tem nada a ver com os genéricos que estão sendo discutidos naquele ramo ou com a prática.

Ele nem mesmo respondeu às tentativas de apontar erros com bobagens.

Esta não é a primeira vez que ele o faz.

Oh, pobre coitado.

Talvez você também seja um daqueles que pesquisam por classificação por matriz e não entendem o que está acontecendo?


Sabe, há muito tempo eu aprendi primeiro a programar - e depois descobri que existem livros de texto sobre programação. Foi o mesmo com o domínio do OOP e outras coisas.

Ainda assim, um fato é um fato. Ninguém deu um exemplo.

Dois exemplos com e sem o uso de matrizes (isto é, sem classes).

É claro, sem qualquer uso de matriz de cordas (isto é para a variante sem a classe).

 

bem, a questão da classificação é sempre relevante - existem opções para uma classificação mais rápida do que a função padrão e, em geral, qual é o código? ...., pois lembro que existem diferentes formas de classificação, dependendo do tamanho da matriz a ser classificada - e a possibilidade de usar memória adicional para acelerar

 

Seria interessante ver os algoritmos de melhor desempenho em números, pelo menos em termos de tempo de execução.

Até agora, parece que estamos defendendo nossa versão como a melhor.

Entretanto, os critérios para esta auto-avaliação não são claros.

 
Комбинатор:

A sério? aqui está um ponto de vista alternativo.

Um homem chegou a um fio sobre o qual não tinha idéia, e foi imediatamente solicitado a deixá-lo, e ele o levou para seu hobby favorito.

ele acabou se mudando para um ramo separado e surgiu um problema incompreensível que não tem nada a ver com os genéricos que estão sendo discutidos naquele ramo ou com a prática.

Ele nem mesmo respondeu às tentativas de apontar erros com bobagens.

Estanão éa primeira vez que ele o faz.

Oh, pobre coitado.

Talvez você também seja o tipo de pessoa que faz a classificação máxima e simplesmente não entende o que está acontecendo?

Sim, eu concordo... Era esperado, mas o que eu queria do Peter era bem diferente (se você tentar analisar o que eu lhe ofereci, meu objetivo será claro)

E eu concordo com isso. Mas o fio foi criado para um propósito diferente - mostrar, discutir.

Mas não para rir. O que isso tem a ver com ficar ofendido? É uma farsa. Primeiro Peter começou no Vasily's, pedi-lhe aqui para uma discussão tranqüila, e não apenas no Peter's. A idéia era diferente - não para se divertir com conceitos errados, mas para contar, explicar... E, o que é mais interessante - tentar inventar algoritmos interessantes. Você entendeu? Não?

:))) É claro. Não sei se isso é verdade :)))

 
Renat Akhtyamov:

Seria interessante ver os algoritmos de melhor desempenho em números, pelo menos em termos de tempo de execução.

Até agora, parece ser tudo uma questão de defender a própria versão como a melhor.

Entretanto, os critérios de tal auto-avaliação não são claros.

Lá - acho que muitas pessoas estariam interessadas nisso.

Bem, todos sabem que Peter, teimosamente em seu ego, prova estranheza - e todos estão fartos disso.

Pessoalmente, gostaria que Peter dirigisse sua persistência numa direção diferente - não para começar uma horta, mas para entender o que lhe está sendo oferecido.

 
Artyom Trishkin:

Lá - acho que muitas pessoas estariam interessadas nisso.

Bem, o fato de que Peter, olhando para seu próprio eu, prova estranheza - todos sabem disso aqui, e todos estão fartos.

Pessoalmente, gostaria que Peter dirigisse sua persistência em uma direção diferente - não para começar uma horta, mas para entender o que lhe é oferecido.

O tempo gasto na operação de qualquer algoritmo é mais fácil de prever/calcular conhecendo o tempo de execução da função, por exemplo, repetindo-o 10 000 vezes.

Mas eu não encontrei o problema de não completar o código até o fim, por mais complicado que seja.

Como eles dizem - bravo MQL!
 
Artyom Trishkin:

Lá - acho que muitas pessoas estariam interessadas nisso.

Bem, o fato de que Peter, teimoso em seu próprio eu, prova estranheza - todos sabem aqui, e todos já estão fartos disso.

Pessoalmente, gostaria que Peter dirigisse sua persistência em uma direção diferente - não para começar uma horta, mas para entender o que lhe é oferecido.

Ninguém é contra ajudar e explicar, etc. Mas Peter em tantos fios reduz tudo à mesma coisa que não há desejo de explicar e ajudar.
 
Alexey Oreshkin:
Ninguém é contra ajudar e explicar, etc. Mas Peter em tantos fios está reduzindo tudo à mesma coisa, que não há desejo de explicar e ajudar.

 
Artyom Trishkin:

Até agora, tudo o que vejo aqui é uma zombaria do homem que teve a audácia de postar aqui sua decisão.

Obviamente, é... para dizer de forma suave, é uma completa perda de tempo. Mas ele o fez. Os demais têm até agora apenas a coragem de rir e apontar o 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;
}
Razão: