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

 
Vladimir Pastushak:

主な作業は、定義された値の配列をクリアすることです。

これをメインタスクにすることはできません。この配列で何が収集され、その後どのように使用されるのでしょうか?

 
Stanislav Korotky:

まあ......それは本気ではないですね。この特定の小さな問題を解決するために象を引くなら、私はSTL::remove(array, value)を挙げるだろう。

それはまさに、とても深刻で根本的なことなのです。MQLはとにかく冗長です。恐ろしいほどそうです。

filter(TCではどれ、フィルタリング)、map(マッピング)、fold(折りたたみ、要約)などの基本的な演算子
は、問答無用ですぐに実行すべきです。そして、最適化されること。

 
Maxim Kuznetsov:

これはまさに、とても深刻で根本的なことなのです。MQLはとにかく冗長です。恐ろしいことです。

filter(TCではフィルタリング)、map(写像)、fold(和算)
といった基本的な演算子は、何の疑問もなく、すぐに実装されるべきものです。そして、最適化されること。

要は、小さなタスクのために、こんな太い(「根本的な」)依存関係を引っ張るのはナンセンスだということです。すべてを賢く書いて、プロジェクト 全体をリファクタリングするのであれば - もちろんですが、それは本来の質問の本質ではありません。

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

指定した要素から配列をクリーニングする

ドミトリー・フェドセーエフ さん 2018.11.12 23:05

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


これはある種の恥ずべきことだ......©︎iconico.com

1.double 型の変数を == で比較することは、控えめに言っても滑稽ではありません。
2.このコードの複雑さはO(n^2)であり、ソートされていない入力列を持つこの問題の最悪の複雑さはO(n)になるはずです。
3.なぜなら、実際にこの関数を使用した場合、返された配列にいくつの有効な値が含まれているかを判断することができないため、このコードは機能しないからです。

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


int OnStart(){
   double arr[] = {3, 5, 5, 3, 3, 5, 5, 3};
   double v = 3;
   
   ArrayPrint(arr);
   DelEl(arr, v);
   ArrayPrint(arr);
   
   return INIT_SUCCEEDED;
}


実行結果です。

2018.11.13 00:35:33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11.13 00:37:08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

無効な値は赤でハイライトされていますが、これらは配列から削除されたわけではありません。

 
Sergey Dzyublik:


これはある種の恥ずべきことだ......©︎iconico.com

1.double型の変数を==で比較するのは、控えめに言って不味いです。
2.コードの複雑さはO(n^2)であり、ソートされていない入力列を持つこの問題の最悪の場合の複雑さはO(n)になるはずです。
3.なぜなら、実際にこの関数を使用した場合、返された配列にいくつの有効な値が含まれているかを判断することができないため、このコードは機能しないからです。


実行結果です。

配列から削除されなかった無効な値は、赤でハイライトされています。

Jublik?そうであってほしい。double 型の 変数の比較は、比較する前に計算しないと、かなり滑稽です。

計算を覚える。羞恥心についてはどうでしょうか。

 
Sergey Dzyublik:


これはある種の恥ずべきことだ......©︎iconico.com

1.double型の変数を==で比較するのは、控えめに言っても滑稽とは言えません。
2.コード複雑度はO(n^2)であり、ソートされていない入力列を持つこの問題の最悪の複雑度はO(n)になるはずです。
3.なぜなら、実際にこの関数を使用した場合、返された配列にいくつの有効な値が含まれているかを判断することができないため、このコードは機能しないからです。


実行結果です。

配列から削除されなかった無効な値は、赤でハイライトされています。

無茶を言わないでください。あなたの間違いを説明しましょうか?それとも自分で推測しますか?全然難しくない...。

3つのポイント、3つのコラール。実は、2つのパドックだけなんです。

ps、しかし、私はあなたを信じています。

ps2 機能を正しく使用した場合の結果はこちらです。


 

そのほうがいい。

void DelEl2(double & a[],double v){
   int sz=ArraySize(a);
   int i=0;   
   int j=0;
   for(;i<sz;i++){ 
      if(a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize(a,j);
}
 
Dmitry Fedoseev:

そのほうがいい。

Dimitri, 動揺させますね。vも配列なんですよ。

とにかく、まったくナンセンスな話なんです。

 
Алексей Тарабанов:

Dimitri, 動揺させますね。vも配列なんですよ。

そして、一般的には、これらはすべて全くナンセンスです。

vが配列であれば問題ない。しかし、ナンセンスであるという事実のほうが、より可能性が高い。この課題を解決する必要性を感じたことはありません。

 

そんなスピード勝負なら、私も自分なりのバリエーションを提案しますよ。

int ArrayDeleteVal(int &a[],const int val) // вариант Semko
  {
   int size=ArraySize(a);
   int i=0,start,s,count;
   while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   s=i; i++;
   while(true)
     {
      while(i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
      if(count>6) { ArrayCopy(a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
      else for(; s<i; start++,s++) a[start]=a[s];                // иначе простой цикл
      if(i==size) break;
      i++;
      while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
      if(i<size) s=i; else break;
      i++;
     }
   if(start<size) ArrayResize(a,start); else start=size;
   return(start);
  }

全バリアント用のテストスクリプトを書きました。
以下は、1 000 000要素(約1000個の余分な値)の配列の場合の結果です。

2018.11.12 19:50:02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.12 19:50:02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.12 19:50:02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.12 19:50:02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
次は誰だ?:))
ピーターさんwwwwwwww
ファイル: