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

 
Sergey Dzyublik:
基本的には、静的なHashSetデータ構造を使用して、衝突を解決するためのデータの初期配列があります。
ただ、実装は目を見張るものがありますね...。

100〜500個の不要なパラメータを持つ関数("FindValueInSortArray")を呼び出す代わりに、通常はクラスを使用し、これらのパラメータはクラスのフィールドとして機能します(コンパイラが暗黙のインライン化を推測しなかった場合、パラメータの受け渡しで 利益を得ます)。
同じサイズで同じ用途の配列の組(int p1[]; int p2[];)を使用する必要がある場合、通常は構造体配列を使用します(インデックスアクセスの利点、キャッシュミスの可能性が低い)。

はい、わかっています。そうですね、私自身、自分の実装が怖いです。しかし、私が目指すのはアルゴリズムであり、実装ではありません。土下座して組み立てる」(約1時間半)と言われるように、アルゴリズムの正しさと速さをチェックするためです。このスレッドでは、「ジャンク値の配列をフラッシュする最速の方法」について議論していることを思い出してください(引用)。

もっとも、私自身のアルゴリズムは普遍的とは言い難いので、不満も多いのですが。アルゴリズムを改善する方法はありますが、コードがかなり複雑になります。時間が残念です。

ZZY HashSet初聴、理論に強くないので。私は何も新しいものを発明していないし、すべて私より前に発明されていることをよく理解している。:))このアルゴリズムの利点は、削除するアイテムの配列が一様分布である場合に顕著である。分布が均一と大きく異なる場合、この実装はこのブランチに既に存在する他の実装と比較して、速度が劣る可能性があります。

 
Taras Slobodyanik:

金額の計算をCRC32に変更しました )

ありがとうございます。もちろん、その方が正しいのですが。

しかし、私が理解する限り、CRC32に切り替えてもエラーは出ませんでした。:)

 

個人的には、最近のコンピュータの性能と、特にMQL5には感心しています。

なにしろ、100万要素の配列から約1000種類の値を探し出し、それらを削除して(約10万セル)、きれいになった配列を再パッケージ化するのに、わずか1/40秒(!!)しかかからないのですから。

 
オプティマイズド
ファイル:
 
nicholi shen :

すべて見事にシンプルです:))

しかし、しかし、このアルゴリズムはメモリを無制限に消費します。

そのため、例えば、以下のように置き換えると

arr[i]= rand ()% 10000 ;
....
Value2[i]= rand ()% 10000 ;

を使って

arr[i]= rand ()* rand ();
....
Value2[i]= rand ()* rand ();

とはいえ、状況はまったく異なる。

2018.11 . 19 23 : 25 : 57.593 ArrayDeleteValue21 (NZDUSD,D1)  вариант nicholi shen: Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -  603551 микросекунд
2018.11 . 19 23 : 25 : 57.980 ArrayDeleteValue21 (NZDUSD,D1)  вариант Nikitin     : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -  383847 микросекунд
2018.11 . 19 23 : 25 : 58.043 ArrayDeleteValue21 (NZDUSD,D1)  вариант fan9        : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -   61414 микросекунд
2018.11 . 19 23 : 25 : 58.074 ArrayDeleteValue21 (NZDUSD,D1)  вариант Semko       : Контрольная сумма = 3902843984.813025 ; элементов - 999983 ; время выполнения -   28430 микросекунд
ファイル:
 
ArrayDeleteValueを プロジェクト 内の数人に追加し、編集権を付与。今まで見逃していた人。
 
Nikolai Semko:

ありがとうございます。確かにこれは正しい方法です。

しかし、私が理解する限り、CRC32に切り替えてもエラーは出ませんでした。:)

しかし、たった1つのアルゴリズムの結果を自分の目で見た人は、他の人にも同じ結果が出るようにすることができるのです)

 
をテーマに書いてください。バタバタしない、悪びれない。ありがとうございます。
 
nicholi shen:

悪いアイデアではありませんが、配列やベクトルに負の値がある場合、array out of range エラーになります。

また、フィルタリングフラグを含む配列のサイズは2 147 483 647 に達する可能性があり、これは多すぎます。

もちろん、32個のBOOL変数の設定をこのようなビットマスクに置き換えることで、32倍のサイズにすることができます。

int array_filter(int &a[],const int &b[]) //nicholishen
{
   int e=ArraySize(a);
   int c[];
   int d =b[ArrayMaximum(b)]+1;
   ArrayResize(c, b[ArrayMaximum(b)]/32 + 1);
   ArrayInitialize(c, 0);
   int i=0;
   int ii=0;
   while(i<ArraySize(b))
   {     
     ii=b[i]/32;
     c[ii]|=(1<<(b[i]-(ii*32)));
     i++; 
   } 
   
   int g=0, h=0, f=0;
   for(g=0; g<e; g++){
      f = a[g];
      ii=f/32;
      if(f >= d || !(c[ii] & (1<<(f-(ii*32)))) )
      {
         a[h]=f;
         h++;
      }
   }
   return ArrayResize(a, h);
}


が、それでも大きすぎて、スピードが半分くらいに落ちてしまいます。

 
Nikolai Semko:

すべて見事にシンプルです:))

しかし、しかし、このアルゴリズムはメモリを無制限に消費します。

そのため、例えば、以下のように置き換えると

を使って

しかし、状況はまったく異なります。

あなたのバージョンも良いのですが、残念ながら弱点もあるのです。国内」条件下、すなわちサイズ〜100の小型アレイとサイズ〜5〜10の小型ベクターで

このアルゴリズムは、ここで紹介したものよりも遅くなります。マイクロ秒の差は非常に小さいので、おそらく問題にはなりませんが、より大きなアレイでは、これがベストとなります。

P.S. 私は、この機能は普遍的なものであるべきで、入力データに応じてピックアップされたいくつかの異なるアルゴリズムを組み合わせる必要があると思います。