算法的优化。 - 页 5 12345678910 新评论 TheXpert 2012.05.21 12:10 #41 Mathemat: 原则上,是的。但仍不超过O(n)。 不算少:)只要有好的想象力,你就能做出指数 级的依赖性:) Vasiliy Sokolov 2012.05.21 12:11 #42 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()将在一个并行线程中启动。当这两个函数终止时,它们的结果将被写入总清单中。情况是这样的。 Sceptic Philozoff 2012.05.21 12:15 #43 C-4: 我在第一个帖子中给出了统计数据。1,000,000条的计算随着周期的增加而呈算术级增长。所以对于第3期,计算需要0.54秒,第51期需要0.94秒,而第99期已经是1.59秒。你走了,你弄错了。这不是算术级数的总和,C-4。总数呈四次方增长。OCL是毫不含糊的。 Vasiliy Sokolov 2012.05.21 12:18 #44 Mathemat:最简单的算法是ArraySort(),内置足够快,大约是O(n * ln( n ))。 但对于这个问题,它可能是多余的。思想。任何排序都会比通过for遍历整个数组的速度要慢。对于给一个迭代,而Arraysort最多只能对每个子窗口n的值进行排序,这本身就意味着要做几十个动作。不,你的目标仍然是使迭代的总次数与条数 在质量上相同。 Документация по MQL5: Доступ к таймсериям и индикаторам / Bars www.mql5.com Доступ к таймсериям и индикаторам / Bars - Документация по MQL5 Vasiliy Sokolov 2012.05.21 12:21 #45 Mathemat:你走了,你弄错了。这不是算术级数的总和,C-4。总数呈四次方增长。OCL是毫不含糊的。 如果是二次元的,那就更糟糕了。据我所知,如果没有多线程,就没有办法绕过它。 hrenfx 2012.05.21 12:40 #46 这样的极值搜索 的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。我马上想到了ExtDepth=n的单程经典ZigZag,并对当前条件稍作调整。OCL在这里是100%不必要的。 TheXpert 2012.05.21 12:45 #47 你们是在火上浇油。你们三个人都是。 Vasiliy Sokolov 2012.05.21 13:00 #48 hrenfx:这样的极值搜索的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。在对当前条件稍作调整后,我立即想到了ExtDepth=n的单程经典ZigZag。OCL在这里是100%不必要的。 原则上,我需要这些极值来做一个人字形。那么使用哪种算法更好呢?是否有比我在第二个版本中引用的代码更有效的代码? hrenfx 2012.05.21 13:06 #49 请看CodeBase MT4中的单通道ZigZags - O(N)。 Sceptic Philozoff 2012.05.21 23:41 #50 TheXpert: 你们是在火上浇油。你们三个人都是。为什么?无论你怎么看,O(n)仍然会存在。如果所有其他方法都失败了,可以试试OCL。没有其他办法,没有dll型变态的5。 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
原则上,是的。但仍不超过O(n)。
嗯,这不是一个优化问题。
寻找极值总是一个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!因此,我们需要重写算法,使迭代次数不会随着周期的增加而有质的提高--这是一个纯粹的优化问题。这就是我现在正在做的事情。到目前为止,我已经写了这个。
为了搜索最小值,相应的函数Down()将在一个并行线程中启动。当这两个函数终止时,它们的结果将被写入总清单中。情况是这样的。
你走了,你弄错了。这不是算术级数的总和,C-4。总数呈四次方增长。
OCL是毫不含糊的。
最简单的算法是ArraySort(),内置足够快,大约是O(n * ln( n ))。 但对于这个问题,它可能是多余的。
思想。任何排序都会比通过for遍历整个数组的速度要慢。对于给一个迭代,而Arraysort最多只能对每个子窗口n的值进行排序,这本身就意味着要做几十个动作。
不,你的目标仍然是使迭代的总次数与条数 在质量上相同。
你走了,你弄错了。这不是算术级数的总和,C-4。总数呈四次方增长。
OCL是毫不含糊的。
这样的极值搜索 的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。
我马上想到了ExtDepth=n的单程经典ZigZag,并对当前条件稍作调整。OCL在这里是100%不必要的。
这样的极值搜索的条件至少可以说是很奇怪的...但即便如此,使用蛮力搜索法也是极其不合理的。
在对当前条件稍作调整后,我立即想到了ExtDepth=n的单程经典ZigZag。OCL在这里是100%不必要的。
为什么?无论你怎么看,O(n)仍然会存在。
如果所有其他方法都失败了,可以试试OCL。没有其他办法,没有dll型变态的5。