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

 
Vladimir Pastushak:

主要任务是清除定义值的数组。

这不能成为主要任务。在这个阵列中收集的是什么,然后如何使用它?

 
Stanislav Korotky:

嗯,这并不严重。如果拉大象来解决这个特殊的小问题,我会提到STL::remove(array, value)。

这只是非常严肃和基本的。MQL只是啰嗦而已。糟糕的是。

基本运算符,如filter(在TC中是哪个,过滤),map(映射),fold(折叠,总结)。
应立即实施,不问问题。并进行优化。

 
Maxim Kuznetsov:

这只是非常严重和根本的问题。MQL只是啰嗦而已。这很可怕。

filter(在TC中是过滤)、map(映射)、fold(求和)这样的基本运算符
,应该立即实现,没有任何问题。并进行优化。

关键是,为一个小任务拉动如此庞大("基本")的依赖性是无稽之谈。如果要明智地写出一切,并重构整个项目--那么,当然,但这不是原来问题的本质。

 

关于交易、自动交易系统和交易策略测试的论坛

从指定的元素中清理一个数组

Dmitry Fedoseev, 2018.11.12 23:05

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


这是某种耻辱......©

1.通过==来比较double类型的变量,说句不好听的,这并不滑稽。
2.该代码的复杂度为O(n^2),在没有排序的输入序列中,这个问题的最差复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。

void DelEl(double & a[],double v){
   int sz=ArraySize(a);
   for(int i=sz-1;i>=0;i--){
      if(a[i]==v){
         sz--;
         for(int j=i;j<sz;j++){
            a[j]=a[j+1];
         }
      }
   }
   ArrayResize(a,sz);
}


int OnStart(){
   double arr[] = {3, 5, 5, 3, 3, 5, 5, 3};
   double v = 3;
   
   ArrayPrint(arr);
   DelEl(arr, v);
   ArrayPrint(arr);
   
   return INIT_SUCCEEDED;
}


执行结果。

2018.11.13 00:35:33.355 Test123 (EURUSD,H1)     3.00000 5.00000 5.00000 3.00000 3.00000 5.00000 5.00000 3.00000
2018.11.13 00:37:08.495 Test123 (EURUSD,H1)     5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 5.00000 3.00000

无效的值用红色突出显示,它们从未从数组中删除。

 
Sergey Dzyublik:


这是某种耻辱......©

1.说句不好听的,通过==来比较双倍类型的变量是不可取的。
2.代码复杂度为O(n^2),在未排序的输入序列中,这个问题的最坏情况复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。


执行结果。

从未从数组中删除的无效值以红色显示。

Jublik?那就这样吧。如果在比较之前不进行计算,比较双倍类型的 变量是相当滑稽的。

学习数学。羞耻心呢?

 
Sergey Dzyublik:


这是某种耻辱......©

1.用==来比较double类型的变量,说句不好听的,并不滑稽。
2.代码复杂度为O(n^2),在未排序的输入序列中,这个问题的最差复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。


执行结果。

从未从数组中删除的无效值以红色显示。

别傻了。要我向你解释你的错误,还是你自己能猜到呢?一点都不难...

三个点,三个畜栏。事实上,不,只有两个围场。

ps,但我对你有信心。

ps2 如果你正确使用这个函数,结果是这样的。


 

那就更好了。

void DelEl2(double & a[],double v){
   int sz=ArraySize(a);
   int i=0;   
   int j=0;
   for(;i<sz;i++){ 
      if(a[i]!=v){
         a[j]=a[i];
         j++;
      }
   }
   ArrayResize(a,j);
}
 
Dmitry Fedoseev:

那就更好了。

迪米特里,让我打乱你的思路--v也是一个数组。

而且无论如何,这完全是胡说八道。

 
Алексей Тарабанов:

迪米特里,让我打乱你的思路--v也是一个数组。

而总的来说,这一切完全是胡说八道。

如果v是一个数组,那就没有问题了。但事实上,它是无稽之谈的可能性更大。我从来没有觉得需要解决这个任务。

 

如果是这样的速度竞赛,我也会提供我自己的变体。

int ArrayDeleteVal(int &a[],const int val) // вариант Semko
  {
   int size=ArraySize(a);
   int i=0,start,s,count;
   while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением val
   start=i; i++;
   while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
   s=i; i++;
   while(true)
     {
      while(i<size && a[i]!=val) i++; // ищем элемент массива со значением val
      count=i-s;
      if(count>6) { ArrayCopy(a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopy
      else for(; s<i; start++,s++) a[start]=a[s];                // иначе простой цикл
      if(i==size) break;
      i++;
      while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным val
      if(i<size) s=i; else break;
      i++;
     }
   if(start<size) ArrayResize(a,start); else start=size;
   return(start);
  }

我为所有的变体写了一个测试脚本。
下面是一个有1 000 000个元素的数组的结果(大约1000个额外的值)。

2018.11.12 19:50:02.965 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.12 19:50:02.969 ArrayDeleteValue (EURUSD,D1)    вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.12 19:50:02.972 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.12 19:50:02.974 ArrayDeleteValue (EURUSD,D1)    вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
谁是下一个?:))
Peter, Awww....
附加的文件: