アルゴリズム、解法、性能比較 - ページ 11

 
Artyom Trishkin:

残りの私たちは、今のところ、笑って指をさす大胆さしか持ち合わせていない。

ということで、別の視点から見てみましょう。

ある人が全く知らないスレッドに入ってきて、すぐに「出て行ってくれ」と言われ、自分の好きな縄張りに持ち込んでしまったのです。

結局、別の支店に移って、その支店で議論されているジェネリックとも、実務とも関係ない、わけのわからない問題を出してきたのです。

間違いを指摘しようとしても、無意味なことで返事をすることもなかった。

今回が初めてではない。

ああ、かわいそうな人。

もしかしたら、あなたも配列ソートで 検索している方で、何が起こっているのか理解できていないのではないでしょうか?

 
Комбинатор:

ということで、別の視点から見てみましょう。

ある人が、全く知らないスレッドに来て、すぐにそのスレッドから離れるように言われ、自分の好きな趣味の世界に持っていったそうです。

結局、別の支店に移って、その支店で議論されているジェネリックとも、実務とも関係ない、わけのわからない問題を出してきたのです。

しかも、その間違いを指摘しようとすると妄言を吐く。

今回が初めてではない。

ああ、かわいそうな人。

もしかしたら、あなたも配列ソートで 検索している方で、何が起こっているのか理解できていないのではないでしょうか?


そういえば、昔、初めてプログラミングを習ったんですが、その時にプログラミングの教科書があることを知りました。OOPをマスターしたりするのもそうでしたね。

それでも事実は事実、誰も例を挙げてはいない。

シートを使用した場合と使用しない場合(つまりクラスなし)の2つの例。

もちろん、文字列配列は一切使用せずに(これはクラスなしのバリアント用です)。

 

ソートの問題は常に関連しています。標準の関数よりも高速なソートのオプションはありますか?

 

少なくとも実行時間の面で、最も性能の良いアルゴリズムを数字で見ることができたら面白いですね。

今のところ、私たちのバージョンがベストであることを守っているように見えます。

しかし、この自己評価の基準は不明確である。

 
Комбинатор:

ということで、別の視点から見てみましょう。

ある人が、全く知らないスレッドに来て、すぐにそのスレッドから離れるように言われ、自分の好きな趣味の世界に持っていったそうです。

結局、別の支店に移って、その支店で議論されているジェネリックとも、実務とも関係ない、わけのわからない問題を出してきたのです。

間違いを指摘しようとしても、無意味なことで返事をすることもなかった。

今回が初めてではない

ああ、かわいそうな人。

もしかしたら、あなたも最大限の配列ソートを するタイプで、何が起こっているのか理解できていないだけなのでは?

そうですね、そうですね...。それは予想通り だったが、私がピーターに求めたものは全く違った(私が彼に提供したものを分析しようとすれば、私の目的は明らかになる)。

そして、私もそれに賛成です。しかし、このスレッドは、見せる、議論するという別の目的で作ら れました。

でも、笑うのはダメ。それが怒ることとどう関係があるんだ?茶番だ。最初にピーターがVasilyのところで始めたので、ピーターだけでなく、ここで静かに議論してほしいとお願いしました。誤解を揶揄するのではなく、伝える、説明する......発想が違うのです。そして、もっと面白いのは、面白いアルゴリズムを考え出そうとすることです。わかりましたか?ダメ?

:)))もちろんです。そんなの知らないよ :)))

 
Renat Akhtyamov:

少なくとも実行時間の面で、最も性能の良いアルゴリズムを数字で見ることができたら面白いですね。

今のところ、自分のバージョンがベストだと擁護することに終始しているようです。

しかし、そのような自尊心の基準は不明確である。

そこへ......多くの人が興味を持つと思うんです。

まあ、ピーターが頑固にエゴを貫いて、奇妙さを証明していることは誰もが知っていることであり、誰もがそれに辟易しているのだ。

個人的には、ピーターにはその執念を別の方向に向けてほしい。菜園を始めるのではなく、自分に何が提供されているかを理解するために。

 
Artyom Trishkin:

そこへ......多くの人が興味を持つと思うんです。

まあ、ピーターが、自己を見つめていることが、異様さを証明しているのだが--ここでは誰もが知っているし、誰もが辟易しているのだ。

個人的には、ピーターにはその執念を別の方向に向けてほしい。家庭菜園を始めるのではなく、自分が何を提供されているのかを理解するために。

アルゴリズムの演算にかかる時間は、関数の実行時間を知ることで、例えば1万回繰り返せば、簡単に予測・計算できる。

しかし、どんなに複雑なコードであっても、最後まで実装されないという問題には遭遇していません。

噂通り、ブラボーMQL!
 
Artyom Trishkin:

そこへ......多くの人が興味を持つと思うんです。

まあ、自分の中で頑固なペテロが異様さを証明しているわけで、ここはみんな知っているし、もうみんな辟易しているわけです。

個人的には、ピーターさんには、その執念を別の方向に向けてほしい。菜園を始めるのではなく、提供されるものを理解するために。

手伝ったり、説明したりすることに反対する人はいません。しかし、多くのスレッドでPeterはすべてを同じものに還元してしまうので、説明や手助けをしようという気持ちがないのです。
 
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;
}