N Time
300:00:00.5460312400:00:00.4720270500:00:00.4820276600:00:00.4250243700:00:00.4410252800:00:00.4350249900:00:00.43002461000:00:00.43802511100:00:00.45202581200:00:00.44202531300:00:00.45002571400:00:00.46402661500:00:00.51002911600:00:00.49502841700:00:00.52002971800:00:00.51102921900:00:00.50902912000:00:00.56903262100:00:00.53203042200:00:00.55603182300:00:00.57503292400:00:00.58503352500:00:00.61403512600:00:00.61203502700:00:00.61603522800:00:00.65103732900:00:00.65103723000:00:00.67703873100:00:00.69003953200:00:00.70404033300:00:00.70004003400:00:00.71904113500:00:00.73204193600:00:00.75104303700:00:00.75104293800:00:00.82904743900:00:00.77604444000:00:00.80804634100:00:00.79904574200:00:00.82404714300:00:00.84604844400:00:00.86904974500:00:00.86804964600:00:00.91205224700:00:00.88705074800:00:00.95205454900:00:00.92305285000:00:00.94305395100:00:00.94605415200:00:00.95905495300:00:00.97505585400:00:00.99205675500:00:01.00105735600:00:01.04405975700:00:01.04005955800:00:01.06106075900:00:01.06106066000:00:01.08606226100:00:01.07306136200:00:01.11706396300:00:01.14006526400:00:01.13706516500:00:01.11906406600:00:01.19606846700:00:01.17406716800:00:01.21106936900:00:01.24907157000:00:01.30107447100:00:01.27507307200:00:01.30907487300:00:01.30007447400:00:01.30607477500:00:01.36107797600:00:01.37407857700:00:01.41908127800:00:01.35007727900:00:01.33507648000:00:01.35307748100:00:01.46908408200:00:01.42708168300:00:01.38707948400:00:01.42508158500:00:01.42508158600:00:01.45008298700:00:01.46008358800:00:01.46308378900:00:01.45008309000:00:01.50608619100:00:01.49308549200:00:01.53408789300:00:01.56208939400:00:01.54708859500:00:01.54508849600:00:01.57308999700:00:01.56408959800:00:01.58409069900:00:01.5970914
今、私は問題を抱えています。 私は、要素のコピーに大きな「コスト」がかかる配列(つまり、大きな「重い」構造体、クラスオブジェクト、長い文字列などの要素)を効率的にソートする必要があります。 常識的には、それらをそのままにして、代わりにある種のポインタ(元の位置のセルのインデックス)をソートすべきです。 以下、これまでの https://www.mql5.com/ru/forum/6476#comment_178318Оставим からの引用です。mql5 で実装してみましょう。
すべてはすでに私たちの前に盗まれているのです :)
MQL5で表計算
入力はソートされる配列のコピー、コメントは注釈、不要なものはコメントアウトすること
すべてはすでに私たちの前に盗まれているのです :)
MQL5で表計算
入力はソートする配列のコピーで、コメントには注釈を入れ、不要なものはコメントアウトする。
意地悪! 曲を台無しに...。というか、そうしようとした。:)
// 良い近似値があることは明らかです。標準ライブラリからサンプルを引っ張ってきたようなものです。:)
パターンがあるんです。しかも、優秀なものもあるんですよ。でも、やっぱり。ここで重要なのは、すべてを別個に使える製品の動作状態まで仕様化し、デバッグすることです。しかも(なぜここに送るのか)--できるだけ早く。つまり、100分の1パーセントまで可能な限り性能を絞り込むことを提案します。:)
これが1つ目です。第二に、オブジェクトのために我々は、一般的なケースでは、いくつかのことができるソート基準の数に等しいインデックス配列の数、+(好ましくは)いくつかの基準インデックス配列に応じてソートでの挿入の関数が必要です。
意地悪! 曲を台無しに...。というか、努力したんですね。:)
// 良い近似値があることは明らかです。標準ライブラリからサンプルを引っ張ってきたようなものです。:)
サンプルもあります。そして、素晴らしいものまで。でも、やっぱり。すべてをチェックし、別に使える状態までデバッグすることが重要です。そして(なぜここに送るかというと)-最速のもの。つまり、100分の1パーセントまで可能な限り性能を絞り込むことを提案します。:)
それがまず第一です。第二に - オブジェクトの我々は、一般的にいくつかの可能性がありますソート基準の数に等しいインデックス配列の数、+(好ましくは)いくつかの基準でソートされたインデックス配列で挿入の機能が必要です。
同じ答えMQL5でスプレッドシートを 使う。
全部あるんです。具体的な問題としては、列ではなく行を操作して作り直すことが可能で、そのために作られた列があり、それらを異なる型として宣言することが可能である。テーブルの種類が同じであれば、すべて再生可能です。
ベースタイプのソートインデックスを持つインルーラーを作りました。
デフォルトでは降順にソートされるが、昇順にソートする場合はソート方向フラグをfalseに設定する。
テスト結果: //配列のインデックス作成 double[], int[], string[]; sequentially : raw array, descending array, ascending array
トレーラーでのライブラリとテスト。
インデクサを "MQL5Include "フォルダに配置します。
ここでは、OCLを扱うためのサンプルクラスを紹介します。もちろん、不完全で不格好なものもありますが、もしかしたら誰かが役に立つかもしれません。
初期化を少しやり直したので、多次元計算ができるようになりました。
素晴らしいテーマですね。
ちょうど今、価格の極値(最小値)を求めるアルゴリズムで最適化問題に直面しました。条件は以下の通り:あるバーがあり、その左右にn本のバーがあり、そのバーが最大値より下(上)である。
n は任意に選んだ自由な値である。右と左の2本のバーの合計が必ず偶数になり、そこに価格極大値の中央のバーが加わるので、期間nは必ず奇数になります。
最初のバージョンのアルゴリズムはあまり考えず、一番わかりやすいコードを書きました。今はWealthLabのプラットフォームを使ってC#で書いていますが、問題のあるアルゴリズムの本質は容易に理解できると思いますので、ここではその最も問題のある部分を紹介します。
問題の全ては2番目のループにある。極限状態の左右の枝を同時に処理するため、(N - 1)/2 本の棒を通過するだけだが、それだけでは十分ではない。測定によると、等差数列の極限を特定する のにかかる時間は周期Nに依存し、これは非常に悪いことである。
期間を試行錯誤すると、算術演算の和に時間がかかり、これは非常に大きな値になってしまいます。
一つの解決策として、追加の変数を導入することが考えられる。結局、極限が特定されれば、その右側に (N - 1)/2 のバーが存在しないことが保証されるので、bar: current_bar + (N - 1)/2 で始まる新しい極限を特定することができるのです。しかし、極小値を極小値とともに特定する必要があり、current_bar + (N - 1)/2 の前に新しい極小値を見つけることができる。そのため、極値や極小値の探索を2回に分けて行う必要があり、せっかくの性能向上が台無しになってしまいます。C#で2つのパスを2つのコアで同時に処理するスレッドに分割することは簡単にできますが、まずは最適なアルゴリズムを見つけて最適化したいと思います。専門家の助けを待っています。
。
まあ、これは最適化問題ではないんですけどね。
ピリオドを試行すると、算術進行の和がとれ、これは非常に大きな値となる。
極限値を求めるのは、データ数をnとするとO(n)のオーダーの問題になるようだ。この漸近的な悪化、つまりO(n^2)をどうすればいいのか、私には想像もつかないのです。あるいは、用語を混同しているのか。
最も単純なアルゴリズムはArraySort() で、O(n * ln( n ) )程度の速度で組み込まれています。 しかし、この問題ではおそらく冗長でしょう。
より高速な再帰的なものを思いつくことができるだろう。
最小値を求めるには、何本分の時間がかかりますか?まあ、100本の小節に対して、最大1.5秒を検索しているとは思えませんけどね。
最も単純なアルゴリズムは ArraySort() で、組み込みのソートでも十分に高速です。 しかし、このタスクではおそらく冗長です。
最適なソートはO(n*log(n))である。まさにredundant。
より高速な再帰的なものを考え出すことができるだろう。
より遅くなる。再帰は最もよく悪である。再帰的?これはおそらく、どうやったって速度は同じぐらいになるケースだと思います。
コードで
minとmaxのサイクルは明示的に分離する必要があります。そして、失敗したらすぐにループを終了させる。
原則的には、そうです。しかし、それでもO(n)以上にはならない。
OCLはここで役に立つでしょう。もちろん、漸近法は変わりません。しかし、速度は100倍になることも十分にあり得ます。