알고리즘, 결정 방법, 성능 비교 - 페이지 11

 
Artyom Trishkin :

나머지는 웃으면서 손가락질할 용기만 남았다.

진지하게? 여기에 대안적인 관점이 있습니다.

한 사람이 주제에 대해 조금도 생각하지 않은 지점에 와서 즉시 거기에서 질문을 받고 더러워져 좋아하는 말에 끌었습니다.

결과적으로 그는 별도의 분기로 이동하여 해당 스레드에서 논의된 제네릭 또는 실습과 관련이 없는 이해할 수 없는 작업을 생각해 냈습니다.

이 문제는 가장 일반적인 방법으로 오류로 해결되었습니다. 정말 결정하지 않았습니다. 게다가 오류를 지적하려는 시도는 말도 안 된다.

게다가 그의 연기는 이번이 처음이 아니다.

uu 불쌍한 일이 기분이 나빠?

아니면 배열의 최대 정렬을 찾고 있고 무슨 일이 일어나고 있는지 이해하지 못하는 사람들 중 하나일 수도 있습니다.

 
Комбинатор :

진지하게? 여기에 대안적인 관점이 있습니다.

한 사람이 주제에 대해 조금도 생각하지 않은 지점에 와서 즉시 거기에서 질문을 받고 더러워져 좋아하는 말에 끌었습니다.

결과적으로 그는 별도의 분기로 이동하여 해당 스레드에서 논의된 제네릭 또는 실습과 관련이 없는 이해할 수 없는 작업을 생각해 냈습니다.

이 문제는 가장 일반적인 방법으로 오류로 해결되었습니다. 정말 결정하지 않았습니다. 게다가 오류를 지적하려는 시도는 말도 안 된다.

게다가 그의 연기는 이번이 처음이 아니다.

uu 불쌍한 일이 기분이 나빠?

아니면 배열의 최대 정렬을 찾고 있고 무슨 일이 일어나고 있는지 이해하지 못하는 사람들 중 하나일 수도 있습니다.


아주 오래전에 저는 프로그래밍을 처음 배웠고 프로그래밍 튜토리얼이 있다는 것을 알게 되었습니다. OOP 등의 개발도 마찬가지였습니다.

여전히 사실은 아무도 예를 제시하지 않은 사실입니다

바람직하게는 2개의 사용 시트 및 없는 시트(즉, 일반적으로 클래스 없음).

물론 문자열 배열을 사용하지 않고(클래스가 없는 옵션을 위한 것입니다)

 

글쎄요, 정렬 문제는 항상 관련이 있습니다. 표준 기능보다 더 빠른 순서를 지정할 수 있는 옵션이 있으며 일반적으로 어떤 종류의 코드가 있습니까?

 

최소한 실행 시간 측면 에서 가장 생산적인 알고리즘을 숫자로 보는 것은 흥미로울 것입니다.

지금까지는 모든 것이 귀하의 버전을 최고로 방어하는 것처럼 보입니다.

그러나 이러한 자기평가의 기준은 불분명하다.

 
Комбинатор :

진지하게? 여기에 대안적인 관점이 있습니다.

한 사람이 주제에 대해 조금도 생각하지 않은 지점에 와서 즉시 거기에서 질문을 받고 더러워져 좋아하는 말에 끌었습니다.

결과적으로 그는 별도의 분기로 이동하여 해당 스레드에서 논의된 제네릭 또는 실습과 관련이 없는 이해할 수 없는 작업을 생각해 냈습니다.

이 문제는 가장 일반적인 방법으로 오류로 해결되었습니다. 정말 결정하지 않았습니다. 게다가 오류를 지적하려는 시도는 말도 안 된다.

더욱이 그의 연기는 이번이 처음 이다.

uuu 불쌍한 일이 기분이 나빠?

아니면 배열의 최대 정렬을 찾고 있고 무슨 일이 일어나고 있는지 이해하지 못하는 사람들 중 하나일 수도 있습니다.

예, 동의합니다 ... 예상 했지만 Peter와 완전히 다른 것을 원했습니다 (내가 그에게 제안한 것을 분석하려고하면 내 목표가 명확해질 것입니다)

그리고 나는 이것에 동의합니다. 그러나 브랜치는 보여주고 토론하기 위해 만들어졌습니다.

그러나 징징거리지 마십시오 . 그리고 여기 기분이 상했습니까? 발라간이 자랐습니다. 첫째, Peter는 Vasily에서 그를 번식시키기 시작했으며 Peter뿐만 아니라 여기에서 차분한 토론을 요청했습니다. 아이디어는 달랐습니다. 망상을 웃는 것이 아니라 말하고, 설명하고 ... 글쎄, 더 흥미로운 것은 흥미로운 알고리즘을 생각해 내기 위해 노력하는 것입니다. 이해했나요? 아니다?

:))) 틀림없이. 어디에서 고아가 될 수 있습니까 :)))

 
Renat Akhtyamov :

최소한 실행 시간 측면 에서 가장 생산적인 알고리즘을 숫자로 보는 것은 흥미로울 것입니다.

지금까지 모든 것이 귀하의 버전을 최고로 방어하는 것 같습니다.

그러나 그러한 자체 평가의 기준은 불분명합니다.

와우~ 많은 분들이 궁금해 하실 것 같아요.

글쎄, Peter가 자신의 자아에 쉬고 있다는 사실이 기이함을 증명합니다. 여기있는 모든 사람들이 알고 있고 모두가 이미 그것에 지쳤습니다.

개인적으로 나는 Peter가 정원을 울타리가 아니라 그에게 제공되는 것을 이해하기 위해 다른 방향으로 그의 인내를 지시하기를 바랍니다.

 
Artyom Trishkin :

와~ 많은 분들이 관심을 가지실 것 같아요.

글쎄, Peter가 자신의 자아에 쉬고 있다는 사실이 기이함을 증명합니다. 여기있는 모든 사람들이 알고 있고 모두가 이미 그것에 지쳤습니다.

개인적으로 나는 Peter가 정원을 울타리가 아니라 그에게 제공되는 것을 이해하기 위해 다른 방향으로 그의 인내를 지시하기를 바랍니다.

알고리즘 작업에 소요된 시간은 예를 들어 10000번과 같이 반복하여 함수의 실행 시간을 알면 예측/계산하기가 더 쉽습니다.

하지만 아무리 복잡해 보여도 코드를 끝까지 실행하지 않는 문제는 아직 경험하지 못했습니다.

그들이 말했듯이 - 브라보 MQL!
 
Artyom Trishkin :

와~ 많은 분들이 관심을 가지실 것 같아요.

글쎄, Peter가 자신의 자아에 쉬고 있다는 사실이 기이함을 증명합니다. 여기있는 모든 사람들이 알고 있고 모두가 이미 그것에 지쳤습니다.

개인적으로 나는 Peter가 정원을 울타리가 아니라 그에게 제공되는 것을 이해하기 위해 다른 방향으로 그의 인내를 지시하기를 바랍니다.

예, 아무도 도와주고 설명하는 것을 반대하지 않습니다. 그러나 Peter는 너무 많은 주제에서 모든 것을 같은 것으로 축소하여 더 이상 설명하고 도움을 주고 싶지 않습니다.
 
Alexey Oreshkin :
예, 아무도 도와주고 설명하는 것을 반대하지 않습니다. 그러나 Peter는 너무 많은 주제에서 모든 것을 같은 것으로 축소하여 설명하고 도움을 주고자 하는 욕구가 없습니다.

 
Artyom Trishkin :

지금까지 나는 여기에 자신의 결정을 게시할 용기를 가진 사람에 대한 조롱만 보았습니다.

그것은 ... 가볍게 말하면 - 단어에서 전혀 쓸모가 없다는 것이 분명합니다. 그러나 그는 게시했습니다. 나머지는 웃으면서 손가락질할 용기만 남았다.


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