Encontrar um extremo é sempre um problema de ordem O(n), onde n é o número de dados. Como se pode tornar esta assimptótica pior - não faço ideia.
O algoritmo mais simples é o ArraySort(), que é incorporado suficientemente rápido, mas é provavelmente redundante para este problema.
Poderia surgir algo recursivo que fosse mais rápido.
Quanto tempo demora a encontrar o mínimo e por quantos bares?
Dei as estatísticas no primeiro posto. O cálculo para 1.000.000 de barras aumenta aritmeticamente à medida que o período aumenta. Assim, para o período 3, o cálculo leva 0,54 segundos, para o período 51 leva 0,94 segundos, e para o período 99 leva 1,59 segundos.
Isto é pior porque utiliza o laço no laço, o que é um erro. Assim, para o período 3 o número de iterações será de 1 000 000 * (3-1/2) = 1 000 000, enquanto para o período 99 será de 1 000 000 * (99-1)/2 = 49 000 000! Por conseguinte, precisamos de reescrever o algoritmo de modo a que o número de iterações não aumente qualitativamente com o aumento do período - este é um puro problema de optimização. Isto é o que estou a fazer agora. Até agora, escrevi isto:
staticvoid 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;
}
}
}
}
Para procurar o mínimo, a função correspondente Down() será lançada num fio paralelo. Quando ambas as funções terminam, os seus resultados serão escritos na lista geral. É algo parecido com isto.
C-4: Dei as estatísticas no primeiro posto. O cálculo para 1.000.000 de barras cresce aritmeticamente à medida que o período aumenta. Assim, para o período 3, o cálculo leva 0,54 segundos, para o período 51 0,94 segundos, e para o período 99 já é de 1,59 segundos.
Aí está, percebeu mal. Não é a soma de uma progressão rica, C-4. A soma cresce quadraticamente.
O algoritmo mais simples é o ArraySort(), incorporado suficientemente rápido, algo em torno de O(n * ln( n ) ), mas é provavelmente redundante para este problema.
Pensamento. Qualquer triagem será inerentemente mais lenta do que percorrer todo o conjunto. Pois dá uma iteração, enquanto que as arraysort na melhor das hipóteses ordenará os valores em cada subjanela n, o que por si só significará dezenas de acções.
Não, deve ainda visar que o número total de iterações seja qualitativamente o mesmo que o número de barras.
A condição para uma busca tão extrema é, no mínimo, estranha. Mas mesmo assim, é extremamente irrazoável usar um método de busca por força bruta.
Um ZigZag clássico de uma passagem com ExtDepth = n vem imediatamente à mente com um ligeiro ajustamento à condição actual. O OCL é 100% desnecessário aqui.
A condição para uma busca tão extrema é, no mínimo, estranha. Mas mesmo assim, é extremamente irrazoável usar um método de busca por força bruta.
Um ZigZag clássico de uma passagem com ExtDepth = n vem imediatamente à mente com um ligeiro ajustamento à condição actual. O OCL é 100% desnecessário aqui.
Bem, em princípio, preciso destes extremos para a la zig-zag. Então que algoritmos são melhores para usar? Existe um código mais eficiente do que aquele que citei na segunda versão?
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Em princípio, sim. Mas ainda não mais do que O(n).
Bem, isto não é um problema de optimização.
Encontrar um extremo é sempre um problema de ordem O(n), onde n é o número de dados. Como se pode tornar esta assimptótica pior - não faço ideia.
O algoritmo mais simples é o ArraySort(), que é incorporado suficientemente rápido, mas é provavelmente redundante para este problema.
Poderia surgir algo recursivo que fosse mais rápido.
Quanto tempo demora a encontrar o mínimo e por quantos bares?
Dei as estatísticas no primeiro posto. O cálculo para 1.000.000 de barras aumenta aritmeticamente à medida que o período aumenta. Assim, para o período 3, o cálculo leva 0,54 segundos, para o período 51 leva 0,94 segundos, e para o período 99 leva 1,59 segundos.
Isto é pior porque utiliza o laço no laço, o que é um erro. Assim, para o período 3 o número de iterações será de 1 000 000 * (3-1/2) = 1 000 000, enquanto para o período 99 será de 1 000 000 * (99-1)/2 = 49 000 000! Por conseguinte, precisamos de reescrever o algoritmo de modo a que o número de iterações não aumente qualitativamente com o aumento do período - este é um puro problema de optimização. Isto é o que estou a fazer agora. Até agora, escrevi isto:
Para procurar o mínimo, a função correspondente Down() será lançada num fio paralelo. Quando ambas as funções terminam, os seus resultados serão escritos na lista geral. É algo parecido com isto.
Aí está, percebeu mal. Não é a soma de uma progressão rica, C-4. A soma cresce quadraticamente.
A OCL é inequívoca.
O algoritmo mais simples é o ArraySort(), incorporado suficientemente rápido, algo em torno de O(n * ln( n ) ), mas é provavelmente redundante para este problema.
Pensamento. Qualquer triagem será inerentemente mais lenta do que percorrer todo o conjunto. Pois dá uma iteração, enquanto que as arraysort na melhor das hipóteses ordenará os valores em cada subjanela n, o que por si só significará dezenas de acções.
Não, deve ainda visar que o número total de iterações seja qualitativamente o mesmo que o número de barras.
Aí está, percebeu mal. Não é a soma de uma progressão rica, C-4. A soma cresce quadraticamente.
A OCL é inequívoca.
A condição para uma busca tão extrema é, no mínimo, estranha. Mas mesmo assim, é extremamente irrazoável usar um método de busca por força bruta.
Um ZigZag clássico de uma passagem com ExtDepth = n vem imediatamente à mente com um ligeiro ajustamento à condição actual. O OCL é 100% desnecessário aqui.
A condição para uma busca tão extrema é, no mínimo, estranha. Mas mesmo assim, é extremamente irrazoável usar um método de busca por força bruta.
Um ZigZag clássico de uma passagem com ExtDepth = n vem imediatamente à mente com um ligeiro ajustamento à condição actual. O OCL é 100% desnecessário aqui.
Porquê? O(n) ainda lá estará, independentemente da forma como se olhe para ele.
Se tudo o resto falhar, tente OCL. Não há outras formas sem perversões do tipo dll em 5.