定義された要素の配列をクリアする。 - ページ 11

 
Nikolai Semko:

ブラボー!いくつかのエラーを修正した後、ArrayCopyを使わなくても、私を台座から叩き落としましたね。チェックメイト:))

変更する価値があると思われます
for(;;)

まで

while(true)

ブレークで まだ終了

追伸:ちょっと面白いので、アレイ全体をダイレクトコピーしてみました。
template<typename T>
int arrayFilter(T &data[],const T value)
  {
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s; i++)
     {
          if( data[i] == value )
          {
               result = true;
               s--;
               continue;
          }
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          ArrayResize(data, s);
     
     return s;
  }
 
Konstantin Nikitin:
変更する価値があると思われます

まで

ブレークで まだ終了

違いはありません。無限ループの中では、forの方が短いし、trueの方が初心者を混乱させないので、私は好きです。
 
MT5/MEオプティマイザー(ビルド1945)の開発者にとって大きな痛手となる。
Terminal Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i7-7700HQ @ 2.80GHz, Memory: 5276 / 16250 Mb.


なぜコードなのか。
arr[j++] = arr[i];

よりも遅く動作する。
arr[j] = arr[i];
j++;



もし、何のルールもなくこのコンテストに参加するのであれば、「リーダー」(現在はKuznetsov)のコードをコピーして、上記のシステムの動作にしたがって改造する必要があります。
これにより、最初の740msecの実行時間から約20msecの安定した利得が得られる。

template <typename T>
int arrayFilter_ALXIMIKS(T &arr[], const T x)  // вариант ALXIMIKS
{
        int i=0;
        int j=ArraySize(arr)-1;
        for(;;) {
                while(arr[i]!=x && i<j) i++;
                while(arr[j]==x && i<j) j--;
                if (i<j) {
                        arr[i]=arr[j];
                        i++;
                        j--;
                } else break;
        }
        ArrayResize(arr,j);
        return j;
}
 

ところで、元の配列が系列である場合、結果がどう変わるのか気になります。ArraySetAsSeries(arr,true)です。

 
Sergey Dzyublik:
このコンテストをルール無しとするならば、「リーダー」(現在はクズネツォフ)のコードをコピーして、上記のシステムの動作に従って修正する。

元の実行時間740msから約20msの安定したゲインが得られています。

加える価値がある。配列要素の 並びを気にしない場合。そうですね、優秀なバリアントです。一貫性を保つことが重要なら、別の何かが必要です。

 

ついでに、私のバージョンもご紹介しましょう。

int SokolovDelRetry(int &array[], const int val)
{
   int total = ArraySize(array);
   int in = -1, count = 0, diff = 0;
   for(int i = 0; i < total; i++)
   {
      diff++;
      if(array[i] == val)
      {
         diff--;
         if(in != -1)
         {
            if(diff>0)
            {
               ArrayCopy(array, array, in, i-diff, diff);
               in = in + diff;
               diff = 0;
            }
            count++;
         }
         else
         {
            in = i;
            diff = 0;
            count++;
         }
      }
   }
   if(diff > 0)
      ArrayCopy(array, array, in, total - diff, diff);
   ArrayResize(array, total - count);
   return total - count;
}

の結果です。

2018.11.14 16:20:15.293 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pastushak: Контрольная сумма = 495345526; элементов - 998956; время выполнения = 89383 микросекунд
2018.11.14 16:20:15.313 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Korotky:   Контрольная сумма = 495345526; элементов - 998956; время выполнения = 18148 микросекунд
2018.11.14 16:20:15.337 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Fedoseev:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 15637 микросекунд
2018.11.14 16:20:15.347 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Semko:     Контрольная сумма = 495345526; элементов - 998956; время выполнения = 4626 микросекунд
2018.11.14 16:20:15.367 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pavlov:    Контрольная сумма = 495345526; элементов - 998956; время выполнения = 16976 микросекунд
2018.11.14 16:20:15.407 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Nikitin:   Контрольная сумма = 495345526; элементов - 997945; время выполнения = 27381 микросекунд
2018.11.14 16:20:15.427 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Vladimir:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 16178 микросекунд
2018.11.14 16:20:15.457 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Peter:     Контрольная сумма = 495345526; элементов - 998956; время выполнения = 19618 микросекунд
2018.11.14 16:20:15.477 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Sokolov:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 11058 микросекунд

S.S. 原則、制限速度に達している。次のステップは、マイクロ最適化とforループをいじるだけです。

ニコライの結果は、こうしたミクロの最適化を巧みに利用したものだと思います。

ファイル:
 
Vladimir Pastushak:

1,2,3,6,9,5,6,3,25,6,8,7,4 型のデータセットを含む配列があり、例えば値 3 を削除して、出力に 3 と空白のない同じ配列を得る必要があります。

不要な値の配列を最速でクリアする方法を探しているのですが・・・。

次のような例が思い浮かびます。

もっと安くて早い方法があるのでは?

ウラジミール、なぜこれが必要なんだ?
私の理解では、インジケーターバッファーで 行う必要があります。しかし、空の値や「不要な」値を前の値や、例えば極値の算術平均に置き換える方が論理的ではありませんか?そうすれば、より高速になり、配列の次元も変わりません。

 
Nikolai Semko:

ウラジミール、なぜこれが必要なんだ?
私の理解では、インジケーターバッファーで 行う必要があります。しかし、空の値や「不要な」値を、前の値や、例えば極値の算術平均で置き換える方が論理的ではありませんか?そうすれば、より高速になり、配列の次元も変わりません。

情報を表示したり、大量の情報を表示したり、それをもとにさらに計算をするために必要なものです。この種の関数は、無関係なデータの配列をクリアするために必要です。そして何より、動作が非常に速いことが重要です私のアナログは速度面で劣り、表示時にフリーズを起こします。

 
Nikolai Semko:

ウラジミール、なぜこれが必要なんだ?
私の理解では、インジケーターバッファーで やるしかないのでは?しかし、例えば、空の値や「不要な」値を、前の値や極値の算術平均で置き換える方が論理的ではありませんか?そうすれば、より高速になり、配列の次元も変わりません。

mql4で複数のEAで大量のオープンポジション/注文がある場合、私見ですが、check for symbolやmagicianで全てのオープンポジションを試すより、チケットで配列を保持し、配列を経由して注文が成立しているか確認する方が簡単だと思います。ですから、注文がクローズされた場合は、配列から「クロスアウト」されるはずです。そのような場合、以前は配列を「自分の中に」コピーして、配列のサイズを1つ小さくしていたのです。Vasiliy Sokolovから 提案されたもので、ありがとうございます。なぜ、いくつもの等しい要素を取り除くことが課題だったのかは、また別の問題ですが......。

ps これを書いている間に、もう答えは出ている。だから質問もすでに間違っている... )))))
 
Alexey Viktorov:

mql4で複数のEAで大量のオープンポジション/注文がある場合、私見ですが、check for symbolやmagicianで全てのオープンポジションを試すより、チケットで配列を保持し、配列を経由して注文が成立しているか確認する方が簡単だと思います。ですから、注文がクローズされた場合は、配列から「クロスアウト」されるはずです。そのような場合、以前は配列を「自分の中に」コピーして、配列のサイズを1つ小さくしていたのです。Vasiliy Sokolovから 提案されたもので、ありがとうございます。なぜ、いくつもの等しい要素を取り除くことが課題だったのかは、また別の問題ですが......。

ps 書いているうちに、もう答えが出てきました。質問もすでに間違っていることが判明・・・ )))))

そのとき、だいたいわかったんです。

配列の順番は重要ではないので、配列の残りの要素を 動かさないように、「穴」を配列の上の方の値で埋めるクズネツォフの変法を使う方が合理的です。もちろんこちらの方が速いです。