算法、解决方法、其性能的比较 - 页 11

 
Artyom Trishkin:

到目前为止,我们其余的人只敢嘲笑和指责。

真的吗?这里有另一种观点。

一个人来到一个他完全不知道的线上,他立即被要求离开,并把它带到了他最喜欢的地盘。

他最后转到了一个单独的分支,并提出了一个难以理解的问题,而这个问题与该分支中正在讨论的泛型或实践毫无关系。

他甚至没有对试图用胡言乱语指出错误的行为作出回应。

这并不是他第一次这样做。

哦,你这个可怜的家伙。

也许你也是那些通过数组排序 搜索而不明白是怎么回事的人之一?

 
Комбинатор:

真的吗?这里有另一种观点。

一个人来到一个他不知道的线上,他立即被要求离开,他把它带到他最喜欢的爱好。

他最后转到了一个单独的分支,并提出了一个难以理解的问题,而这个问题与该分支中正在讨论的泛型或实践毫无关系。

他甚至没有对试图用胡言乱语指出错误的行为作出回应。

这并不是他第一次这样做。

哦,你这个可怜的家伙。

也许你也是那些通过数组排序 搜索而不明白是怎么回事的人之一?


你知道,很久以前,我第一次学习如何编程--然后我发现有关于编程的教科书。掌握OOP和其他东西也是如此。

不过,事实就是事实。 没有人举例说明。

有和没有使用床单的两个例子(即没有类)。

当然,没有使用任何字符串数组(这是对没有类的变体)。

 

排序的问题总是相关的--是否有比标准函数更快的排序选项,一般来说,代码是什么?....,我记得有不同的排序方式,取决于要排序的数组的大小--以及使用额外内存来加速的可能性。

 

如果能在数字上看到表现最好的算法,至少在执行时间上 是很有趣的。

到目前为止,看起来我们正在捍卫我们的版本是最好的。

然而,这种自我评估的标准并不明确。

 
Комбинатор:

真的吗?这里有另一种观点。

一个人来到一个他不知道的主题,他立即被要求离开这个主题,他把它带到了他最喜欢的主题。

他最后转到了一个单独的分支,并提出了一个难以理解的问题,而这个问题与该分支中正在讨论的泛型或实践毫无关系。

他并没有真正解决问题。 更重要的是,当他试图指出错误时,他是妄想。

这并不是他第一次这样做

哦,你这个可怜的家伙。

也许你也是那种做了最大限度的数组排序 的人,只是不明白发生了什么事?

是的,我同意...这是意料之中的 事,但我想从彼得那里得到的东西却截然不同(如果你试着分析一下我给他提供的东西,我的目标就会很清楚)。

我也同意这一点。但创建这个主题是为了一个不同的目的--展示、讨论

但不是为了笑。这与被冒犯有什么关系呢?这是一场闹剧。首先是彼得在瓦西里那里开始的,我让他在这里安静地讨论,而不仅仅是彼得的。这个想法是不同的--不是为了嘲笑错误的观念,而是为了讲述,解释...而且,更有趣的是--尝试想出有趣的算法。你明白吗?不是吗?

:)))当然了。我不知道这一点:)))

 
Renat Akhtyamov:

如果能在数字上看到表现最好的算法,至少在执行时间上 是很有趣的。

到目前为止,这似乎都是在为自己的版本辩护,认为它是最好的。

然而,这种自我评估的标准并不明确。

有--我想很多人都会对这个感兴趣。

好吧,每个人都知道,彼得在他的自我中顽固地证明了奇怪的事情--而且每个人都厌倦了它。

就个人而言,我希望彼得把他的坚持引向另一个方向--不是去开辟一个菜园,而是去了解提供给他的东西。

 
Artyom Trishkin:

有--我想很多人都会对这个感兴趣。

好吧,彼得,盯着他自己的事实,证明了奇怪的地方--这里每个人都知道,每个人都厌倦了它。

就个人而言,我希望彼得把他的坚持引向不同的方向--不是为了开辟一个菜园,而是为了了解他所提供的东西。

通过了解函数的执行时间,例如重复10 000次,任何算法的运行时间都更容易预测/计算。

但我没有遇到过无论多么复杂的代码都不能完成到最后的问题。

正如他们所说的那样--MQL好样的!
 
Artyom Trishkin:

有--我想很多人都会对这个感兴趣。

好吧,彼得在他自己身上的固执,证明了奇怪的事实--这里每个人都知道,而且每个人都已经厌倦了它。

就个人而言,我希望彼得把他的坚持引向不同的方向--不是开辟一个菜园,而是了解提供给他的东西。

没有人反对帮助和解释,等等。但彼得在如此多的主题中把一切都简化为同样的事情,没有解释和帮助的意愿。
 
Alexey Oreshkin:
没有人反对帮助和解释等等。但彼得在如此多的主题中把一切都归结为同一件事,以至于没有解释和帮助的意愿。

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