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

 

同じToRで2つのコードバリアントを比較します。

//+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
   ulong q1 = GetMicrosecondCount(); 
   //--------------------------------
   int deleted = 0,q = 0;
   //-------------- 
   for(int a1 = 0; a1 < ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q] = Arr[q + deleted];
      if(Arr[q] == 3){deleted++; q--;}
      q++;
     }
   //--------------
   ulong q2 = GetMicrosecondCount(); 
   //--------------------------------
   //ArrayResize(Arr, ArraySize(Arr) - deleted);    
   //--------------------------------
   Print(Arr[0],",",Arr[1],",",Arr[2],",",Arr[3],",",Arr[4],",",Arr[5],",",Arr[6],",",Arr[7],",",Arr[8],",",Arr[9],
        ",",Arr[10],",",Arr[11],",",Arr[12],",",Arr[13],",",Arr[14],",",Arr[15],",",Arr[16],",",Arr[17],",",Arr[18],",",Arr[19]);
   Print("Array new size  ",ArraySize(Arr),"  Тime of operation  ",q2-q1,"  deleted  ",deleted);
   //--------------------------------  
  }
//+------------------------------------------------------------------+

и:

int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(Arr[a1] == 3)
     {
      if(deleted)a1-= deleted;//Cмещение назад.
      deleted++; 
     }
   if(deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);
これは、同じ人が1時間強の間隔をおいて書いたものなのでしょうか?筆跡に疑問あり )
 
Maxim Kuznetsov:

アレクセイ、若い才能を殺すのか...。

このマーケッターは5年間売れ始められないでいる...そしてプログラマーとしてはもっとダメだと言っているのだろう

ごめん、殺すつもりはなかったんだ。

 
Maxim Kuznetsov:

:-) もし、順番を守ろうとしなければ、時間はO(1)、すべてのループのステップ数の合計=配列の大きさ

コーディングするのが面倒くさい :-)

1.左から3つ目までを検索します。

2. もし見つかったら、右から左へ3でないものを探し、3の場所にコピーする。

が交差するまで続け、コピーした数だけ配列を切り詰める。

理想は「バブルソート」のちょうど1/2です :-) もしコピーの代わりにスワップを行えば、出力は部分配列になります(3/3がすべて右側に移動します)。

すべてのループの総ステップ数=配列の大きさは、O(n)の複雑さです。
入力配列がソートされている場合、二項探索により 問題を解く。
計算量は平均でO(log(n))、最悪でO(n)である。

 
コーディングするのが面倒くさいとなると、最悪です。
 
Nikolai Semko:

Peterのバージョンはまだコツがつかめません。

かなりコンパクトにまとまっていて、ちゃんと動作までする。ピーターに拍手
しかし、スピードという点では端から2番目です。このスレ主の速度可変で全く使えないオリジナルを除けば端から1位か。

どのようにテストしたのですか?

 
最後に投げたものは選択肢にない。とにかくやりすぎなければならない。
 
Реter Konow:

テストはどのように行っているのですか?

コードを勉強する。

2018.11.14 03:26:49.182 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 496575839; элементов - 998974; время выполнения = 131158 микросекунд
2018.11.14 03:26:49.185 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2431 микросекунд
2018.11.14 03:26:49.188 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 1809 микросекунд
2018.11.14 03:26:49.190 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 785 микросекунд
2018.11.14 03:26:49.194 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2839 микросекунд
2018.11.14 03:26:49.199 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 496575839; элементов - 997971; время выполнения = 4049 микросекунд
2018.11.14 03:26:49.204 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 3888 микросекунд
2018.11.14 03:26:49.212 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 7597 микросекунд
ファイル:
 
Алексей Тарабанов:
コーディングするのが面倒くさいとヤバい。

全然怠けてるわけじゃないんだけど、MTはVDS上だけで、実験しないんだよね。

それについて

template <typename T>
int arrayFilter(const  T &arr[], const T x)
{
        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--];
                } else break;
        }
        ArrayResize(j+1);
        return j+1;
}

+- 1 :-) 数日後にサマーキャンプから戻ってくるので、チェックしてみますね...。

ps. さらに、このコードでは、終了時に余分なループエントリがあります...ささいなことですが、これは取り除くことができます

 
Maxim Kuznetsov:

全然怠けてるわけじゃないんだけど、MTはVDS上だけで、実験しないんだよね。

それについて

+- 1 :-) 数日後に田舎から帰ってきますので、チェックしてみますね・・・。

ps. さらに、このコードでは、最後にループに余分な入力があります...ささいなことですが、取り除くことができます

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

template <typename T>
int arrayFilter3(T &arr[], const T x)  // вариан Kuznetsov
{
        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--];
                } else break;
        }
        ArrayResize(arr,j+1);
        return j+1;
}
2018.11.14 03:48:29.572 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 131929 микросекунд
2018.11.14 03:48:29.576 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2411 микросекунд
2018.11.14 03:48:29.579 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 1839 микросекунд
2018.11.14 03:48:29.581 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 782 микросекунд
2018.11.14 03:48:29.585 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2813 микросекунд
2018.11.14 03:48:29.590 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 496206996; элементов - 997969; время выполнения = 4200 микросекунд
2018.11.14 03:48:29.596 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 3597 микросекунд
2018.11.14 03:48:29.604 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 7684 микросекунд
2018.11.14 03:48:29.606 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 681 микросекунд
ファイル:
 
Nikolai Semko:

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

出力配列がかなり違うので、正確にはそうではないのですが、すでにミックスされています。でも、とにかくカッコイイ!

もちろん、見積書を扱う場合、これはうまくいきません。再び表彰台に立つことができました。))

チェックサムの計算方法を変更しました。全要素の単純合計ではなくなり、(要素値)/(要素番号)の合計となる。
そして、こんなものが出来上がりました。

2018.11.14 04:20:26.063 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 132291 микросекунд
2018.11.14 04:20:26.067 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2322 микросекунд
2018.11.14 04:20:26.071 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 1831 микросекунд
2018.11.14 04:20:26.074 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 773 микросекунд
2018.11.14 04:20:26.079 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2879 микросекунд
2018.11.14 04:20:26.085 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 7093.903216084301; элементов - 998017; время выполнения = 3605 микросекунд
2018.11.14 04:20:26.090 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 3622 микросекунд
2018.11.14 04:20:26.100 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 7252 микросекунд
2018.11.14 04:20:26.102 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 7085.49357433088;  элементов - 999003; время выполнения = 691 микросекунд
ファイル: