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

 
Nikolai Semko:
要するに、どのアルゴリズムも同じなんです。誰もが配列を1要素ずつ修正し、不要なものがないフェドセーエフの変形を目指したのです。
ただ、私の場合はArrayCopyを使ってブロック単位で行っているので、スピード面では有利です。

ピョートルはどうする?みんな「ボロボロ」になってしまったのか?誰も彼のコードをチェッカーに入れなかった。どのように、どの程度、掲示板でみんなをあっと言わせたのだろう。

 
Vladimir:

理由を考えて、その中の2行を0.1%ではなく、3分の1の要素を削除するように修正しました。

結論:配列内のアドレスをその番号の間に任意の距離を置いて計算することは、与えられたステップで行のアイテムを処理するよりもまだ悪く、ステップ1ではコンパイラが最適化できるため、なおさらそうです。

なるほど、そういうことだったんですね。なぜかこのフレーズを見逃していました
はい、もちろん明確なのですが、それでも、3番目の要素をすべて捨てなければならないときでも(その後、ArrayCopyは 私のために動作しなくなり、賞金は消えます)、絵は違っています。

2018.11.13 13:46:01.524 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 332864; элементов - 667202; время выполнения = 66640 микросекунд
2018.11.13 13:46:01.531 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5932 микросекунд
2018.11.13 13:46:01.537 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 332864; элементов - 667202; время выполнения = 5142 микросекунд
2018.11.13 13:46:01.544 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 332864; элементов - 667202; время выполнения = 5831 микросекунд
2018.11.13 13:46:01.552 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5493 микросекунд
2018.11.13 13:46:01.563 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 958449; элементов - 667202; время выполнения = 11026 микросекунд

パブロフの変種は本当に効かないのですが、チェックサムも正しいものと正しくないものがありますよね。

ファイル:
 
Artyom Trishkin:

ピーターについてはどうですか?全部バラバラにしたんですか?誰も彼のコードをチェッカーに挿入していない。彼がどのように、そしてどの程度、掲示板の皆を驚かせたのか、興味深いです。

私はまだ彼の空想が理解できない。まだ、既成の機能を提供していないのです。それに、もし私が完成させてあげたら、また「全部やり直しだ」と責められるでしょう。))

 
Nikolai Semko:

私はまだ彼の空想が理解できない。まだ、既成の機能を提供していないのです。それに、もし私が完成させてあげたら、また「全部やり直しだ」と責められるでしょう。))

さて、携帯電話から彼のコードを見ていると、「わかりやすく書いている」という印象があります。だから、彼は機能を提供しなかったのです。彼はすべてを一列に並べて行います。そして、彼のスクリプトは関数ではなく、ストレートなコードです。もちろん、このようなスクリプトは機能を意味しないかもしれませんが...。フライトのためのゴトが不足しているのだと思います :)

でも、それはあくまで私の感覚です。

 
Nikolai Semko:

パブロフのバリアントを修正しました。
この数値はおかしい。プロファイリングやデバッグを行った後、コードを再コンパイルせずにスクリプトを実行したのではありませんか?
私の場合は、そういうことなんです。

そして、あなたのバリアントでは、間違ったチェックサムが表示されます。アレイを追加で作成しても全く利益にならず、それどころか処理が遅くなり、追加のリソースを食いつぶしてしまいます。

修正しました。

int ArrayDelV(int &a[],const int val)
  { // вариант Vladimir
   bool Flags[]; // массив пометок на удаление
   int N,NewN,i,j;
   N=ArraySize(a);
   ArrayResize(Flags,N);
   if (ArrayInitialize(Flags,false)!=N) return(-1);
   NewN=N; // Сколько останется
   for(i=0;i<N;i++) {if(a[i]==val) {Flags[i]=true; NewN--;}}
   j=0;
   for(i=0;i<N;i++) {if(!Flags[i]) {a[j]=a[i]; j++;}}
   ArrayResize(a,NewN);
   return(NewN);
  }

何度か実行しましたが、結果は宙ぶらりんです。コンピュータは本当に忙しく、土曜日まで暇になりません。他の人に確認した方がいい。しかし、チェックサムが一致するようになった。スパース性の高い不要値(0.1%)の場合

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) option Pastushak: Checkum = 497057781; elements - 998984; execution time = 418662 microseconds.
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variant Korotky: Checkum = 497057781; elements - 998984; execution time = 10683 microseconds
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variant Fedoseev: Checkum = 497057781; elements - 998984; execution time = 9740 microseconds
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variant Semko: Checkum = 497057781; elements - 998984; execution time = 4691 microseconds
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variant Pavlov: Checkum = 497057781; elements - 998984; execution time = 12512 microseconds
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variant Nikitin: Checkum = 497057781; elements - 998984; execution time = 10720 microseconds
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variant Vladimir: Checkum = 497057781; elements - 998984; execution time = 17197 microseconds

三分の一

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variant Pastushak: Checkum = 668222; elements - 667065; execution time = 65732 microseconds
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variant Korotky: Checkum = 668222; elements - 667065; execution time = 4757 microseconds
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variant Fedoseev: Checkum = 668222; elements - 667065; execution time = 4815 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Semko: Checkum = 668222; elements - 667065; execution time = 5812 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Pavlov: Checkum = 1001157; elements - 667065; execution time = 0 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Nikitin: Checkum = 668222; elements - 667065; execution time = 4749 microseconds.
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variant Vladimir: Checkum = 668222; elements - 667065; execution time = 9814 microseconds.
パブロフがまた墜落した。

ループ for ループの高速化に関する私の結論は、おそらく MQL 言語では正しくありません。

そして、追加の配列を作成することで、余分なものを取り除き、その開始の必要な瞬間まで配列を変更しないようにして、トランザクション自体の持続時間を短縮する必要があります。今のところ、ここではデータ保存の話は出ていません。

 
Artyom Trishkin:

ピーターはどうですか?彼はみんなを "泣かせた "のか?誰も彼のコードをチェッカーに入れなかった。どのように、どの程度、掲示板でみんなをあっと言わせたのだろう。

でも、なんとかピーターのバージョンを手に入れることができたんだ。

int PeterArray(int &Arr[],const int val) // вариант Peter Konov
  {
   int deleted=0,q=0;
   for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize(Arr,q);
   return (q);
  }

かなりコンパクトで、しかも正しく動作する。ピョートルさんに拍手
しかし、スピードという点では端から2番目に位置する。このスレの主のスピードに全く合わないオリジナル版を除けば端から1位か。

2018.11.13 14:08:32.857 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 150492 микросекунд
2018.11.13 14:08:32.861 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2441 микросекунд
2018.11.13 14:08:32.865 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 1852 микросекунд
2018.11.13 14:08:32.867 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 779 микросекунд
2018.11.13 14:08:32.871 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2374 микросекунд
2018.11.13 14:08:32.876 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 3720 микросекунд
2018.11.13 14:08:32.885 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 7266 микросекунд
ファイル:
 

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

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

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

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

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

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

 
Реter Konow:

より洗練されたものに。

すみません、マーケティングは得意でもプログラマーは...と言われるんです。私よりもっとひどい

1.内部整数変数は初期化されていないので、0になりますが、保証されません。ループの中で、シフトバックが(1回目)起こらないのは、同時に2つの理由があるからです。どれだと思いますか?

2.(最も重要なことですが) まず配列の要素を シフトし、次に削除された変数の値を増やすと、ループが発生して、次のシフトが必要以上に1つ多く発生します。つまり、あなたのコードは元の配列に雪崩れ込んでしまうのです。

 
エクストリームオプション
配列に余分な要素はありません。
2018.11.13 14:44:33.512 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 137515 микросекунд
2018.11.13 14:44:33.514 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1408 микросекунд
2018.11.13 14:44:33.517 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1807 микросекунд
2018.11.13 14:44:33.519 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 672 микросекунд
2018.11.13 14:44:33.522 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1433 микросекунд
2018.11.13 14:44:33.527 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4025 микросекунд
2018.11.13 14:44:33.533 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4297 микросекунд
配列には不要な要素がすべて含まれています。
2018.11.13 14:47:15.338 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 2000000000; элементов - 0; время выполнения = 2093 микросекунд
2018.11.13 14:47:15.341 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 0; элементов - 0; время выполнения = 2257 микросекунд
2018.11.13 14:47:15.343 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 0; элементов - 0; время выполнения = 1078 микросекунд
2018.11.13 14:47:15.345 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 0; элементов - 0; время выполнения = 665 микросекунд
2018.11.13 14:47:15.348 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 0; элементов - 0; время выполнения = 1580 микросекунд
2018.11.13 14:47:15.353 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 0; элементов - 0; время выполнения = 4064 микросекунд
2018.11.13 14:47:15.362 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 0; элементов - 0; время выполнения = 7982 микросекунд
ファイル:
 
Алексей Тарабанов:

すみません、マーケティングは得意でもプログラマーは...と言われるんです。私よりもっとひどい


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

このマーケッターは5年間も売れずにいて、プログラマーとしてはもっとダメだと言うんですね :-)