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

 
Реter Konow:
ある問題に対する完璧な解決策が、なぜ嘲笑と受け取られるのか。マジで理解できない...。

あなたの仕事は何でしたか?ここで公開し、ご自身で思い出してください。

 
Vasiliy Sokolov:

意味不明なことを書いていますね。基本的には、インデックスで配列にアクセス する方法と同じです。現実には、トランザクションの数字はランダムであり、この例は実際の問題を解決する必要があるときに崩れてしまう。


明日はきっと、うまくいくから待っててね。

 
Реter Konow:

***

サイズが変わっても配列からデータが消えないようにするとしたら、***。

ここでは、動的配列である 1次元のarr_dynamic と2次元のarr_dynamic_multi について確認します。

//+------------------------------------------------------------------+
//|                                                  ArrayResize.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим динамические массивы
   double arr_dynamic[];
   double arr_dynamic_multi[][2];
//--- новый размер в первом измерении массива
   if(ArrayResize(arr_dynamic,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }

   for(int i=0;i<ArraySize(arr_dynamic);i++)
      arr_dynamic[i]=i;
   for(int i=0;i<ArrayRange(arr_dynamic_multi,0);i++)
     {
      arr_dynamic_multi[i][0]=i;
      arr_dynamic_multi[i][1]=i*10;
     }

//--- распечатка значений до увеличения размера
   Print("Перед ArrayResize массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("Перед ArrayResize массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- увеличим размер на два элемента
   if(ArrayResize(arr_dynamic,ArraySize(arr_dynamic)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,ArrayRange(arr_dynamic_multi,0)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после увеличения размера
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- новый размер в первом измерении массива установим равным 3 (то есть уменьшим размер массива)
   if(ArrayResize(arr_dynamic,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после уменьшение размера
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);
  }
//+------------------------------------------------------------------+


ご覧のように、配列のサイズが 大きくなっても、以前の値が残って います。

Перед ArrayResize массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000 3.00000 4.00000
Перед ArrayResize массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
После ArrayResize (увеличения размера) массив "arr_dynamic" имеет такие элементы:
  0.00000   1.00000   2.00000   3.00000   4.00000  -0.00000  +0.00000
После ArrayResize (увеличения размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
[5,] +0.00000 +0.00000
[6,] +0.00000 +0.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic" имеет такие элементы:
0.00000 1.00000 2.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]  0.00000  0.00000
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
ファイル:
 
Vasiliy Sokolov:

意味不明なことを書いていますね。基本的には、インデックスで配列にアクセス する方法と同じです。現実には、トランザクションの数字はランダムであり、実際の問題を解決する必要があるときに、この例全体が崩れてしまいます。

チケットのことを指しているのでしょう。シーケンシャルなトランザクション番号のことです。

チケットを記録するために、隣り合わせに平行配列にすることができます。

あるいは、各注文の残りのデータを記録するために、複数の並列アレイを用意する。

 
Vladimir Karputov:

ここでは、動的配列である 1次元のarr_dynamic と2次元のarr_dynamic_multi について確認します。


ご覧のように、配列のサイズを大きく しても、以前の値が残って います。


ここに隠す 純粋なOOPとすべての有用性

 
Vladimir Karputov:

ここでは、動的配列である 1次元のarr_dynamic と2次元のarr_dynamic_multi について確認します。


ご覧のように、配列のサイズを大きくしても、以前の値は残ります

ありがとうございます。これは非常に貴重な情報です。
 

Print and Comment - Why no one is paying attention」についてお話したいと思います。

 
Vasiliy Sokolov:

ところで、CHashMapにはなぜかCapacityという 魔法のプロパティがありません(これは開発者の重大な過失です)。それを指定することで、再パーティションを回避している。このタスクで指定できるので、特に問題はないでしょう。

CHashMapのCapacityは コンストラクタで指定することができます。

ワシリー・ソコロフ

ところで、なぜスケーリングの係数が違うのか、これも非常に不思議です。CHashMap は単純な CArrayList よりも並べ替えが難しいです。

CHashMapの辞書サイズは、辞書内のハッシュの均一 性を保つために、単純な数であるべきです。
CHashMapはCPrimeGeneratorを使用して素数を選択する。
しかし、残念ながらCPrimeGeneratorの実装は期待に応えず、以下の値しか入っていません。

const static int  CPrimeGenerator::s_primes[]=
  {
   3,7,11,17,23,29,37,47,59,71,89,107,131,163,197,239,293,353,431,521,631,761,919,
   1103,1327,1597,1931,2333,2801,3371,4049,4861,5839,7013,8419,10103,12143,14591,
   17519,21023,25229,30293,36353,43627,52361,62851,75431,90523,108631,130363,156437,
   187751,225307,270371,324449,389357,467237,560689,672827,807403,968897,1162687,1395263,
   1674319,2009191,2411033,2893249,3471899,4166287,4999559,5999471,7199369
  };
平均成長率は1.2%程度です。
 
Vasiliy Sokolov:

あなたの仕事は何でしたか?ここで公開し、ご自身で思い出してください。

将来のトランザクション数が不明な場合に、配列(リスト、辞書...)にメガを追加し、トランザクション番号で 配列からメガを取り出すための最速かつ最も効率的な解を見つけること

 
Реter Konow:

配列(リスト、辞書...)にメガを追加し、配列からメガを取り出す際に、将来のトランザクション数が未知数である場合に、最も高速で効率的な解決策を求めよ


当然のことながら、チケットは問題なし

それでも、私は、ボイラープレート関数のようなすべての種類のものであなたのコードを複雑にし始めることをお勧めします。