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

 
Nikolai Semko:

好样的!在纠正了几个错误后,即使不使用ArrayCopy,你也把我打下了神坛。将军。:))

这可能值得改变
for(;;)


while(true)

仍然通过休息时间 退出

P.S. 只是为了好玩,在整个阵列中进行了直接复制。
template<typename T>
int arrayFilter(T &data[],const T value)
  {
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s; i++)
     {
          if( data[i] == value )
          {
               result = true;
               s--;
               continue;
          }
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          ArrayResize(data, s);
     
     return s;
  }
 
Konstantin Nikitin:
这可能值得改变


仍然通过休息时间 退出

这没有什么区别。在无限循环中,我更喜欢for,因为它更短,而且真实不会让新手感到困惑。
 
对于MT5/ME优化器(build 1945)的开发者来说,这是一个巨大的痛苦。
终端 Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i7-7700HQ @ 2.80GHz, 内存: 5276 / 16250 Mb


为什么要用代码。
arr[j++] = arr[i];

运行速度慢于。
arr[j] = arr[i];
j++;



如果你在没有任何规则的情况下参加这个比赛,你应该复制 "领导者"(目前是库兹涅佐夫)的代码,并按照上述的系统行为进行修改。
这导致了从最初的740毫秒的运行时间中获得了约20毫秒的稳定增益。

template <typename T>
int arrayFilter_ALXIMIKS(T &arr[], const T x)  // вариант ALXIMIKS
{
        int i=0;
        int j=ArraySize(arr)-1;
        for(;;) {
                while(arr[i]!=x && i<j) i++;
                while(arr[j]==x && i<j) j--;
                if (i<j) {
                        arr[i]=arr[j];
                        i++;
                        j--;
                } else break;
        }
        ArrayResize(arr,j);
        return j;
}
 

顺便说一下,我很好奇如果原始数组是一个系列,结果会有什么变化。ArraySetAsSeries(arr,true)。

 
Sergey Dzyublik:
如果我们把这个比赛当作没有规则的比赛,我们复制 "领导者"(目前是库兹涅佐夫)的代码并根据系统的上述行为进行修改。

我们从原来的740毫秒执行时间中获得了约20毫秒的稳定增益。

这是值得补充的。如果你不关心数组元素的 顺序。那么是的,这是一个优秀的变体。如果保持一致性很重要,那么就需要其他东西。

 

既然如此,这里是我的版本。

int SokolovDelRetry(int &array[], const int val)
{
   int total = ArraySize(array);
   int in = -1, count = 0, diff = 0;
   for(int i = 0; i < total; i++)
   {
      diff++;
      if(array[i] == val)
      {
         diff--;
         if(in != -1)
         {
            if(diff>0)
            {
               ArrayCopy(array, array, in, i-diff, diff);
               in = in + diff;
               diff = 0;
            }
            count++;
         }
         else
         {
            in = i;
            diff = 0;
            count++;
         }
      }
   }
   if(diff > 0)
      ArrayCopy(array, array, in, total - diff, diff);
   ArrayResize(array, total - count);
   return total - count;
}

结果。

2018.11.14 16:20:15.293 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pastushak: Контрольная сумма = 495345526; элементов - 998956; время выполнения = 89383 микросекунд
2018.11.14 16:20:15.313 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Korotky:   Контрольная сумма = 495345526; элементов - 998956; время выполнения = 18148 микросекунд
2018.11.14 16:20:15.337 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Fedoseev:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 15637 микросекунд
2018.11.14 16:20:15.347 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Semko:     Контрольная сумма = 495345526; элементов - 998956; время выполнения = 4626 микросекунд
2018.11.14 16:20:15.367 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Pavlov:    Контрольная сумма = 495345526; элементов - 998956; время выполнения = 16976 микросекунд
2018.11.14 16:20:15.407 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Nikitin:   Контрольная сумма = 495345526; элементов - 997945; время выполнения = 27381 микросекунд
2018.11.14 16:20:15.427 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Vladimir:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 16178 микросекунд
2018.11.14 16:20:15.457 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Peter:     Контрольная сумма = 495345526; элементов - 998956; время выполнения = 19618 микросекунд
2018.11.14 16:20:15.477 ArrayDeleteValue__6 (FORTS-USDRUB,H1)   вариант Sokolov:  Контрольная сумма = 495345526; элементов - 998956; время выполнения = 11058 микросекунд

S.S. 原则上,已经达到了速度限制。下一步只是微优化和摆弄for循环。

我认为尼古拉的结果是对这种微观优化的巧妙运用。

附加的文件:
 
Vladimir Pastushak:

有一个数组包含一组1,2,3,6,9,5,6,3,25,6,8,7,4类型的数据,你需要删除例如数值3,得到相同的数组,在输出中没有3和空位...

我正在寻找清除数组中不必要的值的最快方法...

我想到了以下的例子

也许有一种更便宜、更快捷的方法?

弗拉基米尔,这有什么必要?
按照我的理解,必须用指标缓冲 器来完成。但是,用前一个值或例如极端值的算术平均值来替换空值和/或 "不必要的 "值不是更符合逻辑吗?那么它将会快得多,而且数组的尺寸将保持不变。

 
Nikolai Semko:

弗拉基米尔,这有什么必要?
按照我的理解,必须用指标缓冲 器来完成。但是,用前一个值或例如极端值的算术平均值来替换空值和/或 "不必要的 "值不是更符合逻辑吗?那么它将会快得多,而且数组的尺寸将保持不变。

这对于显示信息、大量的信息和在此基础上进行进一步的计算是必要的。需要一个这样的函数来清除数组中不相关的数据。最重要的是,它必须非常迅速地工作!我的模拟机在速度方面比较差,它在显示信息时导致冻结。

 
Nikolai Semko:

弗拉基米尔,这有什么必要?
根据我的理解,你必须用指标缓冲 器来做。但是,用前一个值或极端值的算术平均值替换空的和/或 "不必要的 "值,不是更符合逻辑吗?那么它将会快得多,而且数组的尺寸将保持不变。

当mql4中存在大量未结头寸/订单的多个EA时,在我看来,保留带有票据的数组,并通过数组检查订单是否被关闭,而不是通过检查符号和魔术师来尝试所有未结头寸。因此,如果订单被关闭,它应该被从数组中 "划掉"。在这种情况下,我习惯于将数组 "复制到自身",并将数组大小减少一个。这是瓦西里-索科洛夫 的建议,非常感谢,我将知道这不是最难的选择,因为我从未想过速度问题。为什么任务是去除几个相等的元素是另一个问题...

ps 当我在写这篇文章的时候,答案已经在那里了。所以这个问题也已经错了......))))))
 
Alexey Viktorov:

当mql4中存在大量未结头寸/订单的多个EA时,在我看来,保留带有票据的数组并通过数组检查订单是否被关闭,而不是通过检查符号和魔术师来尝试所有未结头寸。因此,如果订单被关闭,它应该被从数组中 "划掉"。在这种情况下,我习惯于将数组 "复制到自身",并将数组大小减少一个。这是瓦西里-索科洛夫 的建议,非常感谢,我将知道这不是最难的选择,因为我从未想过速度问题。为什么任务是去除几个相等的元素是另一个问题...

ps 我在写的时候,答案已经有了。事实证明,这个问题也已经错了... ))))))

我当时大致想明白了。

如果我们有一个数组,顺序并不重要,所以使用库兹涅佐夫的变体更合理,用数组上部的值填充 "洞",这样就不会移动数组 的其他元素。这当然会更快。