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

 

这里是最好的版本,使用二进制搜索。

#include <Arrays\ArrayInt.mqh>
int array_filter(int &arr[], const int &filters[])
{
   int size_arr = ArraySize(arr);
   CArrayInt filterz;
   filterz.AssignArray(filters);
   filterz.Sort();
   int i=0, k=0;
   for(i=0; i<size_arr; i++)
      if(filterz.Search(arr[i]) < 0)
         arr[k++] = arr[i]; 
   return ArrayResize(arr, k); 
}


我不会说俄语,我用谷歌翻译。
 
jdjahfkahjf:

他不是俄罗斯人,这很难理解。El habla espanol。

当我路过那里时,我很想学习西班牙语,但不知为何我放弃了......徒劳无功。
 
template<typename T>
int arrayFilter(T &data[], const T value)
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

template<typename T>
int arrayFilter(T &data[], const T &value[])
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          bool p = false;
          for(int y=0; y<ArraySize(value); y++)
               if( data[i] == value[y] )
               {
                    result = true;
                    s--;
                    p = true;
                    break;
               }
          if( p )
               continue;
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

你如何需要它,就是你最后如何能召唤它。

 
Konstantin Nikitin:

你如何需要它,就是你最后如何能召唤它。

一个value[]的副本,在进入函数时要进行排序,并且

二进制搜索会更快,西班牙人就在这里。

 
Maxim Kuznetsov:

一个value[]的副本,在进入函数时要进行排序,并且

二进制搜索会更快,这个西班牙人说的没错。

我没有打扰自己。我只是做了一个快速转移。是的,而且可能有字符串数组。

P.S. 我受够了这种娱乐。现在是谈正事的时候了。
 
Maxim Kuznetsov:

一个value[]的副本,在进入函数时要进行排序,并且

二进制搜索会更快,这个西班牙人说的没错。

我将使用HashSet数据结构 来取值。
复杂度将是O(n)+O(m)。

对于建议的二进制搜索,其复杂度将是:O(n log(m))

 

24页--我不明白气质从何而来,你可以通过一个原始的任务,把脚本从第三页开始,因为没有力量再读下去,增加了三行,内联没有函数。

N=ArraySize(arr)-1;
for(int i=N;i>=0;i--) if(arr[i]==Value) arr[i]=arr[N--]; N++;
ArrayResize(arr,N);
2018.11.17 01:44:40.077 ArrayDeleteValue (EURUSD,H1)    вариант Pastushak: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 308973 микросекунд
2018.11.17 01:44:40.092 ArrayDeleteValue (EURUSD,H1)    вариант Korotky: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11531 микросекунд
2018.11.17 01:44:40.107 ArrayDeleteValue (EURUSD,H1)    вариант Fedoseev: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11325 микросекунд
2018.11.17 01:44:40.114 ArrayDeleteValue (EURUSD,H1)    вариант Semko: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2819 микросекунд
2018.11.17 01:44:40.117 ArrayDeleteValue (EURUSD,H1)    вариант Inline: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2600 микросекунд

这很奇怪,但看起来他打败了所有人--"在五分钟内,没有任何花招"(C),然后去睡觉了......)

附加的文件:
 
Ivan Negreshniy:

24页--我不明白气质从何而来,你可以通过一个原始的任务,把脚本从第三页开始,因为没有力量再读下去,增加了三行,内联没有函数。

很奇怪,但看起来我打败了所有人--"在五分钟内,没有任何技巧"(C),然后去睡觉了......))

1.你拿了年代不明的代码,这是对社区的直接不尊重;
2。你在代码中做了修改,在里面的某个地方做了nagamno编码,甚至没有把它们放到单独的函数中;
3。然后,显然,你在DEBUG编译中启动了代码进行性能测试,因为执行速度 和结果都不符合RELEASE版本。
4。你的代码含有错误,根本不能解决问题。(由于arr[N--] 可能包含一个既未被过滤也未被删除的)。

但从这种 "赢家 "的悲怆...

 

好的。只要没有工作,疯狂的测试就会继续。我已经添加了新的矢量测试,并同时加入了@Ivan Negreshniy 的选项,看,整理一下你的错误,你的算法是不工作的。

我们得到了这个

1

附加的文件:
 

小型优化

P.S. 纠正了错误并替换了文件

附加的文件: