算法的优化。 - 页 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遍历整个数组的速度要慢。对于给一个迭代,而Arraysort最多只能对每个子窗口n的值进行排序,这本身就意味着要做几十个动作。

不,你的目标仍然是使迭代的总次数与条数 在质量上相同。

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

你走了,你弄错了。这不是算术级数的总和,C-4总数呈四次方增长。

OCL是毫不含糊的。

如果是二次元的,那就更糟糕了。据我所知,如果没有多线程,就没有办法绕过它。
 

这样的极值搜索 的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。

我马上想到了ExtDepth=n的单程经典ZigZag,并对当前条件稍作调整。OCL在这里是100%不必要的。

 
你们是在火上浇油。你们三个人都是。
 
hrenfx:

这样的极值搜索的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。

在对当前条件稍作调整后,我立即想到了ExtDepth=n的单程经典ZigZag。OCL在这里是100%不必要的。

原则上,我需要这些极值来做一个人字形。那么使用哪种算法更好呢?是否有比我在第二个版本中引用的代码更有效的代码?
 
请看CodeBase MT4中的单通道ZigZags - O(N)。
 
TheXpert: 你们是在火上浇油。你们三个人都是。

为什么?无论你怎么看,O(n)仍然会存在。

如果所有其他方法都失败了,可以试试OCL。没有其他办法,没有dll型变态的5。