アルゴリズムの最適化 - ページ 5

 
Mathemat:
原則的には、そうです。しかし、それでもO(n)以上にはならない。
想像力を働かせれば、指数関数的に 変化させることができます。)
 
Mathemat:

まあ、これは最適化問題ではないんですけどね。

極限値を求めるのは常にO(n)のオーダーを持つ問題であり、nはデータ数である。この漸近的な悪化は、どうすればいいのか......私にはわからない。

最も単純なアルゴリズムはArraySort()で、これは組み込みで十分高速ですが、この問題ではおそらく冗長です。

より高速な再帰的なものを思いつくことができるだろう。

最小値を求めるには、何本分の時間がかかりますか?

最初の投稿で統計を出しました。1,000,000本の計算では、周期が長くなるにつれて算術的に増加します。つまり、期間3では0.54秒、期間51では0.94秒、期間99では1.59秒の計算時間がかかる。

これは、ループの中のループを使うので、エラーになり、最悪です。つまり、期間3では、1 000 000 * (3-1/2) = 1 000 000、期間99では、1 000 000 * (99-1)/2 = 49 000 000となるのです!したがって、周期が長くなっても反復回数が質的に増加しないようにアルゴリズムを書き換える必要がある。これは純粋な最適化問題である。これが今、私がやっていることです。これまで私はこう書いてきました。

static void Up(Bars MyQuotes)
        {
            BitArray bits = new BitArray(MyQuotes.Count);
            double max = double.MinValue;
            int pperiod = (23 - 1) / 2;
            int bar = pperiod;
            int count = MyQuotes.Count - pperiod;
            //последняя позиция второго перебора.
            int pos = bar;
            while (bar < count)
            {
                for (int i = 1; i <= pperiod; i++)
                {
                    max = MyQuotes.High[bar - i] > MyQuotes.High[bar + i]
                              ? MyQuotes.High[bar - i]
                              : MyQuotes.High[bar + i];
                    pos = bar + i;
                    if(max > MyQuotes.High[bar])
                    {
                        //Начинаем с последнего бара
                        bar = pos;
                        break;
                    }
                    if(i == pperiod)
                    {
                        bits[bar + i] = true;
                        bar = pos;
                    }
                }
            }
        }

最小値を探索するために、対応する関数Down()が並列スレッドで起動されます。両方の関数が終了すると、その結果が一般リストに書き込まれます。こんな感じです。

 
C-4: 最初の投稿で統計を出しました。1,000,000本の計算では、周期が長くなるにつれて算術的に大きくなっていく。つまり、期間3では0.54秒、期間51では0.94秒、期間99ではすでに1.59秒の計算時間がかかっている。

ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は。和は二次関数的に増大する。

OCLは曖昧さがない。

 
Mathemat:

最も単純なアルゴリズムはArraySort()で、O(n * ln( n ) )程度の速度で組み込まれています。 しかし、この問題ではおそらく冗長でしょう。

想い。ソートすると、forで配列全体を処理するよりも本質的に遅くなります。1回の繰り返しで、arraysortはせいぜいn個のサブウィンドウの値を並べ替える程度で、それだけで数十回の動作を意味する。

いいえ、それでも繰り返し回数の合計が、バーの数と 質的に同じになることを目指すべきでしょう。

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
Mathemat:

ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は和は二次関数的に増大する。

OCLは曖昧さがない。

2次関数なら、なおさらだ。マルチスレッドがなければ、私の理解では、どうしようもない。
 

そんな極限探索の 条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。

ExtDepth = nのワンパス・クラシックZigZagがすぐに思い浮かびますが、現状では少し調整する必要があります。ここでは、OCLは100%不要です。

 
あなたたちは燃えています。3人ともね
 
hrenfx:

そんな極限探索の条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。

ExtDepth=nのワンパス・クラシック・ジグザグは、現状を少し調整することですぐに思いつきます。ここでは、OCLは100%不要です。

まあ、原理的には、ラ・ジグザグにはこの極値が必要なんですけどね。では、どのアルゴリズムを使うのが良いのでしょうか?第2回で引用したコードより効率的なコードはありますか?
 
CodeBase MT4 - O(N)のシングルパスジグザグを確認してください。
 
TheXpert: あなたたちは燃えています。3人ともね

なぜ?O(n)はどう考えても残っているでしょう。

どうしてもダメなら、OCLを試してみてください。5のDL型変態がなければ、他の方法はない。

理由: