清除一个定义元素的数组 - 页 12

 
Alexey Viktorov:

因此,如果一个订单被关闭,它必须从阵列中 "划掉"。在这种情况下,我习惯于将数组 "复制到自身",并将其大小减少一个。

在这种情况下,我将把一个不存在的票据写进数组-1,等到所有的订单都被关闭,然后删除整个数组(数组大小应该被设置为1)。

在这种方法中,票据数组中的一个元素(如果没有顺序)被检查,只有一个条件:如果(ArrayOfTicket[i] > 0) .....

我认为,这比不断 "摇出 "阵列要快。

 
Igor Makanu:

在这种情况下,我将把一个不存在的票据写进数组-1,等到所有的订单都关闭后,删除整个数组(数组大小=1)。

在这种方法中,票据数组中的一个元素(如果没有顺序)被检查,只有一个条件:如果(ArrayOfTicket[i] > 0) .....

我认为,这比不断 "摇出 "阵列要快。

我不明白...逐个删除元素或检查不存在的订单的索引有什么区别呢......反正数组是摇动的......。

总之,正如他们今天在新闻中所说的那样,不可能为味道申请专利。冲牙器只是颜色不同,但它们的味道都一样。

 
Alexey Viktorov:

我不明白...你是想一个一个地删除项目,还是检查不存在的订单的索引,这有什么区别呢......反正数组会超限......。

总之,正如他们今天在新闻中所说的那样,不可能为味道申请专利。Floureshers只在颜色上有区别,但它们的味道都一样。

删除一个元素意味着复制数组中的剩余元素,我不删除数组中的元素,我把不存在的元素(票据)标记为-1的值,当没有市场订单时,我删除一个数组的票据。

至于浮选标记,这肯定是真的,这取决于问题,原则上,在优化过程中通常有2种解决方案。

- 要么增加算法的复杂性,但节省了电脑的内存和计算资源。

- 或简化算法,节省计算资源但浪费内存

 

校验和不正确,如果数组中存在0,则可能有错误

尼基丁的变体正是对这样的错误起作用。

附加的文件:
456.mq5  20 kb
 
Vladimir Pastushak:

校验和不正确,如果数组中存在0,则可能有错误

尼基丁的变体正好适用于这种错误。

是的,你是对的。只有尼基丁另外抛出了零要素。这就是为什么他的代码看起来好像是有问题的。实际上是解决了你最初设定的任务。
如果你记录下他对空元素的检查,结果是一样的。

2018.11.14 13:50:34.481 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 133765 микросекунд
2018.11.14 13:50:34.486 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2330 микросекунд
2018.11.14 13:50:34.489 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 1840 микросекунд
2018.11.14 13:50:34.492 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 777 микросекунд
2018.11.14 13:50:34.497 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 2818 микросекунд
2018.11.14 13:50:34.503 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 3922 микросекунд
2018.11.14 13:50:34.510 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 4239 микросекунд
2018.11.14 13:50:34.519 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 7192.975450836821; элементов - 998993; время выполнения = 7307 микросекунд
2018.11.14 13:50:34.522 ArrayDeleteValue (BTCUSD,M15)   вариант Kuznetsov: Контрольная сумма = 7185.677992388435; элементов - 998993; время выполнения = 683 микросекунд

同样,校验和现在考虑到了元素的顺序,以前没有。

附加的文件:
 
哦,算了吧。我刚刚喝完我的啤酒。我将在除夕前准备好~25升的酒。现在这就是你所说的。
 
Nikolai Semko:

是的,你是对的。只有尼基丁也在抛出额外的无效元素。这就是为什么他的代码看起来好像是错的。实际上是解决了你最初设定的任务。
如果你记录下他对空项的检查,结果是一样的。

同样,现在的校验和考虑到了元素的顺序,以前没有。

顺便说一下,如果顺序非常重要,你可以在我的变体后面加上ArraySort,看看ArraySort到底有多大效果。

 

我现在对另一个问题感兴趣,我找不到答案。
也许有人能解释一下为什么库兹涅佐夫的代码会出现这种变体。

    for(;;)
     {
      while(arr[i]!=x && i<j) i++;
      while(arr[j]==x && i<j) j--;
      if(i<j)
        {
         arr[i++]=arr[j--];
        }
      else break;
     }

它的工作速度是这个的两倍多,它做的事情完全一样。

   while(i<j)
     {
      if(arr[i]==x)
         if(arr[j]!=x) arr[i++]=arr[j--];
      else j--;
      else i++;
     }

编译器的奇妙之处在于什么?
对于这样的设计,是否有可能。

while(arr[i]!=x && i<j) i++;

编译器是否为处理器找到一些特殊的汇编查询命令?
有谁对现代处理器的命令很强吗?

 
Maxim Kuznetsov:

顺便说一下,如果顺序非常重要,我可以在我的版本末尾添加ArraySort,同时让我们看看ArraySort的效果到底如何。

我已经试过了。这是一个相当昂贵的功能。不过,事后扔掉比较容易。所有必要的都要排成一排。


尼古拉-森科

是的,你是对的。只有尼基丁在另外投掷空项。这就是为什么他的代码看起来不对。实际上,这是你在一开始就确定的任务。
如果你记录下他对空项的检查,结果是一样的。

几乎任何功能都可以适应它。这是我的最后一个(这纯粹是实验性的,但似乎是最不昂贵的一个)。
template<typename T>
int arrayFilter(T &data[],const T value=NULL)
  {
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s; i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          ArrayResize(data, s);
     
     return s;
  }
 
Nikolai Semko:

:

工作速度是做同样事情的两倍以上。


优化器是无关紧要的--比较的结果不到一半...