算法的优化。 - 页 9

 
Andrey Dik:
是的,这就是我所做的。
但在同一个字符上经常有相同的时间点,当一毫秒内有几个点的时候
这就是我被卡在逻辑上的地方。

为了实际的目的,我也许应该采取最坏的情况

 

有从开始N到结束N的数字,包括在内。

你需要将CountN的组合在每个

我为3的组合中的数字数量写了这个脚本。

input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 5;

void OnStart()
{
  string str = "";
  
  //уровень 0
  for (int i = StartN; i <= EndN; i++)
  {
    //str = StringSubstr (str, 0, 0);
    //str += (string)i;
    str = (string)i;
    
    //уровень 1
    for (int k = StartN; k <= EndN; k++)
    {
      str = StringSubstr (str, 0, 1);
      str += (string)k;
      
      //уровень 2
      for (int l = StartN; l <= EndN; l++)
      {
        str = StringSubstr (str, 0, 2);
        str += (string)l;
        
        Print (str);
      }
    }
  }
}

其中输出。

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD...,H4: 111

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD.,H4: 110

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD.,H4: 101

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD.,H4: 100

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD.,H4: 011

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD.,H4: 010

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD.,H4: 001

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD.,H4: 000

我很困惑,怎样才能使它在指定的CountN数量下工作?

 

一个数字的二进制表示...

 
Aliaksandr Hryshyn:

一个数字的二进制表示...

这不是重点,这只是我采取的参数,从0到1(包括)。

以[0;2]为例

而你得到的是。

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 221

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 220

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 212

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 211

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 210

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 202

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 201

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 200

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 122

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 121

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 120

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 112

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 111

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 110

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 102

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 101

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 100

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 022

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 021

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 020

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 012

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 011

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 010

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 002

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 001

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 000

 
Andrey Dik:

有从开始N到结束N的数字,包括在内。

我需要将CountN的组合在每个

我很困惑,如何让它在给定数量的CountN下工作?

我想我以前做过这个,题目是这样的

https://www.mql5.com/ru/forum/335077

 
Andrey Dik:

不是这样的,只是我把参数从0到1包括在内。

采取[0;2]

而我们得到的是。

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD.,H4: 221

...

所以问题归结为将主循环的数字转换为另一个数字系统,再加上对StartN的修正

 
Aliaksandr Hryshyn:

所以问题归结为将主循环的数字转换为另一个数字系统,再加上对StartN的修正

我可以拥有这个代码吗?

 
Igor Makanu:

我想我以前做过这个,这里有一个主题

https://www.mql5.com/ru/forum/335077

不是所有的代码都很好,但似乎是我所需要的,我会把它修好的,我会把它贴在这里。

现在代码没有生成全长的组合

 
Igor Makanu:

我想我以前做过这个,这里有一个主题

https://www.mql5.com/ru/forum/335077

它没有得到我需要的东西,代码中有太多目的不明确的循环。

我的解决方案是这样的。

#property script_show_inputs

//--- input parameters
input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 3;

void OnStart ()
{
  string base [];
  
  //алгоритм сочетаний без повторений
  CombinationGenerator (StartN, EndN, CountN, base);

  //выведем полученные комбинации в принт
  for (int i = 0; i < ArraySize (base); i++) Print (base [i]);
}

string CreateString (int &base [])
{
  string s = "";
  for (int i = 0; i < ArraySize (base); i++) s += (string)base [i];

  return s;
}

//Алгоритм сочетаний без повторений
void CombinationGenerator (int startN, int endN, int rowLen, string &base [])
{
  ArrayResize (base, (int)pow (EndN - StartN + 1, CountN));
  int comb [];
  ArrayResize (comb, CountN);
  ArrayInitialize (comb, StartN);
  string str = "";
  int pos = 0;
  base [pos] = CreateString (comb);

  bool flag = true;

  while (flag && !IsStopped ())
  {
    for (int l = 0; l < CountN; l++)
    {
      if (comb [l] + 1 <= EndN)
      {
        comb [l] += 1;

        pos++;
        base [pos] = CreateString (comb);
        break;
      }
      else
      {
        if (l == CountN - 1) flag = false;
        comb [l] = StartN;
      }
    }
  }
}

我假设这段代码的迭代次数越少越好。

结果在[0;1]的数字与第3行的数字。

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 111

2020.07.13 01:21:41.037 sProbCandlComb EURUSD.,M5: 011

2020.07.13 01:21:41.037 sProbCandlComb EURUSD.,M5: 101

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..., M5: 001

2020.07.13 01:21:41.037 sProbCandlComb EURUSD.,M5: 110

2020.07.13 01:21:41.037 sProbCandlComb EURUSD.,M5: 010

2020.07.13 01:21:41.037 sProbCandlComb EURUSD.,M5: 100

2020.07.13 01:21:41.037 sProbCandlComb EURUSD..., M5: 000

结果为数值[0;2],数字在第4行。

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0222.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0022.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2020.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 2000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 1000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD.,M5: 0000

算法逻辑很简单,与计算规则相同:在数位上加1,如果数位上的数字多于我们设定的最小数,就进入下一个数位,如果在下一个数位上没有 "归零",就回到第一个数位。

的确,我的数字不是在右边,而是在左边,嗯,糟糕。

0000

0001

0010

0011

0100

0101

....

等。


通过使用递归可能会得到更漂亮的代码,但不可能更快。

 
Andrey Dik:

你的例子不是一个组合,而是一个没有重复的permutation

而我的例子是一个没有重复的组合

原因: