Algoritmaların optimizasyonu. - sayfa 5

 
Mathemat :
Sanırım, evet. Ama yine de O(n)'den fazla değil.
Daha az değil :) iyi bir hayal gücü ile üstel bağımlılığı azaltabilirsiniz :)
 
Mathemat :

Eh, bu bir optimizasyon sorunu değil.

Bir ekstremum bulmak her zaman O(n) düzeyinde bir problemdir, burada n veri sayısıdır. Bu asimptotiklerin nasıl daha kötü hale getirilebileceğini hayal bile edemiyorum.

En basit algoritma ArraySort() sıralamadır, yerleşik oldukça hızlıdır. Ama muhtemelen bu görev için fazladan.

Daha hızlı olacak özyinelemeli bir şey bulabilirsin.

Minimum ve kaç çubuk için ne kadar süreyle arama yapıyorsunuz?

İstatistikleri ilk mesajda verdim. 1.000.000 bar için hesaplama, periyottaki artışla aritmetik olarak büyür. Dolayısıyla, 3. periyot için hesaplama 0.54 saniye, 51. periyot için 0.94 saniye ve 99. periyot için zaten 1.59 saniyedir.

Döngü içinde döngü kullandığı için daha da kötüleşir, bu bir hatadır. Yani 3. periyot için yineleme sayısı 1.000.000 * (3-1/2) = 1.000.000 olacak, ancak 99. periyot için 1.000.000 * (99-1)/2 = 49.000.000 olacak! Bu nedenle algoritma, sabit miktarda veri ile yineleme sayısı periyottaki artışla niteliksel olarak artmayacak şekilde yeniden yazılmalıdır ve bu tamamen bir optimizasyon problemidir. Şimdi yaptığım şey bu. Şimdiye kadar şunu yazdım:

 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;
                    }
                }
            }
        }

Minimumu aramak için paralel bir iş parçacığında çalışan uygun bir Down() işlevi olacaktır. Her iki işlevin de tamamlanmasından sonra sonuçları genel listeye eklenecektir. Bunun gibi bir şey.

 
C-4 : İstatistikleri ilk mesajda verdim. 1.000.000 bar için hesaplama, periyottaki artışla aritmetik olarak büyür. Dolayısıyla, 3. periyot için hesaplama 0.54 saniye, 51. periyot için 0.94 saniye ve 99. periyot için zaten 1.59 saniyedir.

Pekala, karıştırdım. Bu, ritmik bir ilerlemenin toplamı değildir, C-4 . Miktar ikinci dereceden büyüyor.

kesinlikle OCL.

 
Mathemat :

En basit algoritma, oldukça hızlı olan, O(n * ln( n ) ) bölgesinde bir şey olan ArraySort() yerleşik sıralamadır. Ama muhtemelen bu görev için fazladan.

Düşünce. Herhangi bir sıralama, for kullanarak tüm dizi üzerinde yineleme yapmaktan açıkça daha yavaş olacaktır. For bir yineleme verirken, arraysort en iyi ihtimalle her n alt penceresindeki değerleri sıralar, bu da kendi içinde düzinelerce eylem anlamına gelir.

Hayır, sonuçta, burada toplam yineleme sayısının niteliksel olarak çubuk sayısından farklı olmadığından emin olmak için çaba göstermeniz gerekir.

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

Pekala, karıştırdım. Bu, ritmik bir ilerlemenin toplamı değildir, C-4 . Miktar ikinci dereceden büyüyor.

kesinlikle OCL.

İkinci dereceden ise, daha da kötü. Anladığım kadarıyla çoklu iş parçacığı vazgeçilmezdir.
 

Böyle bir ekstrem aramanın şartı, en hafif tabirle, tuhaftır... Fakat buna rağmen, önden arama yöntemini kullanmak son derece mantıksızdır.

ExtDepth = n ile tek geçişli klasik bir ZigZag, mevcut duruma küçük bir ayarlama ile hemen akla geliyor. OCL burada %100 gereksizdir.

 
Erkekleri yaşa. Her üçü.
 
hrenfx :

Böyle bir ekstrem aramanın şartı, en hafif tabirle, tuhaftır... Fakat buna rağmen, önden arama yöntemini kullanmak son derece mantıksızdır.

ExtDepth = n ile tek geçişli klasik bir ZigZag, mevcut duruma küçük bir ayarlama ile hemen akla geliyor. OCL burada %100 gereksizdir.

Prensip olarak, bir la zikzak için bu uç noktalara ihtiyacım var. O zaman özellikle hangi algoritmaları kullanmak daha iyidir? İkinci sürümde sağladığımdan daha verimli bir kod var mı?
 
CodeBase MT4 - O(N) içinde tek geçişli ZigZag'lara göz atın.
 
TheXpert : Adamları yakın. Her üçü.

Ve ne? O(n) ne derse desin yine de olacaktır.

Hepsi başarısız olursa, OCL'yi deneyin. Beşte dll tipinin sapmaları olmadan başka bir yol yoktur.