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

 

对比相同的ToR上的2个代码变体。

//+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
   ulong q1 = GetMicrosecondCount(); 
   //--------------------------------
   int deleted = 0,q = 0;
   //-------------- 
   for(int a1 = 0; a1 < ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q] = Arr[q + deleted];
      if(Arr[q] == 3){deleted++; q--;}
      q++;
     }
   //--------------
   ulong q2 = GetMicrosecondCount(); 
   //--------------------------------
   //ArrayResize(Arr, ArraySize(Arr) - deleted);    
   //--------------------------------
   Print(Arr[0],",",Arr[1],",",Arr[2],",",Arr[3],",",Arr[4],",",Arr[5],",",Arr[6],",",Arr[7],",",Arr[8],",",Arr[9],
        ",",Arr[10],",",Arr[11],",",Arr[12],",",Arr[13],",",Arr[14],",",Arr[15],",",Arr[16],",",Arr[17],",",Arr[18],",",Arr[19]);
   Print("Array new size  ",ArraySize(Arr),"  Тime of operation  ",q2-q1,"  deleted  ",deleted);
   //--------------------------------  
  }
//+------------------------------------------------------------------+

и:

int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
int deleted;
//-------------- 
for(int a1 = 0; a1 < ArraySize(Arr); a1++)
  {
   if(Arr[a1] == 3)
     {
      if(deleted)a1-= deleted;//Cмещение назад.
      deleted++; 
     }
   if(deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize(Arr, ArraySize(Arr) - deleted);
这可能是同一个人写的,相隔一个多小时?笔迹有问题 )
 
Maxim Kuznetsov:

阿列克谢,你在扼杀青年人才......

这个营销人员5年来都没能开始销售......而你却说他作为一个程序员更糟糕

对不起,我不是故意要杀你。

 
Maxim Kuznetsov:

:-) 如果你不试图保持顺序,时间是O(1) ,所有循环的总步数=数组大小

懒得编码 :-)

1.从左到右搜索前3个。

2.如果找到了,就从右到左找一个非三,把它复制到3的位置。

继续下去,直到1,2相交为止,按拷贝的数量修剪数组。

理想情况下,它正好是 "气泡排序 "的1/2 :-) 如果不是复制,而是进行交换,输出将是一个部分有序的数组(所有3/3都移到右边)。

所有循环的总步数=数组大小是O(n)复杂度。
如果输入数组被排序,给定的问题将通过二进制搜索 解决。
复杂度在平均情况下是O(log(n)),在最坏情况下是O(n)。

 
当你懒得编码时,这已经很糟糕了。
 
Nikolai Semko:

仍然掌握了彼得的版本。

它相当紧凑,甚至可以正常工作。为彼得点赞。
但就速度而言,它从头到尾都是第二位。或者说,从最后的第一名,如果你不计算原始的,完全不能用的速度变体的这个主题的主人。

你是如何测试的?

 
你扔的东西不是一个选项,最后一个。反正你要做得很过分。
 
Реter Konow:

你是如何进行测试的?

研究代码。

2018.11.14 03:26:49.182 ArrayDeleteValue (BTCUSD,M15)   вариант Pastushak: Контрольная сумма = 496575839; элементов - 998974; время выполнения = 131158 микросекунд
2018.11.14 03:26:49.185 ArrayDeleteValue (BTCUSD,M15)   вариант Korotky:   Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2431 микросекунд
2018.11.14 03:26:49.188 ArrayDeleteValue (BTCUSD,M15)   вариант Fedoseev:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 1809 микросекунд
2018.11.14 03:26:49.190 ArrayDeleteValue (BTCUSD,M15)   вариант Semko:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 785 микросекунд
2018.11.14 03:26:49.194 ArrayDeleteValue (BTCUSD,M15)   вариант Pavlov:    Контрольная сумма = 496575839; элементов - 998974; время выполнения = 2839 микросекунд
2018.11.14 03:26:49.199 ArrayDeleteValue (BTCUSD,M15)   вариант Nikitin:   Контрольная сумма = 496575839; элементов - 997971; время выполнения = 4049 микросекунд
2018.11.14 03:26:49.204 ArrayDeleteValue (BTCUSD,M15)   вариант Vladimir:  Контрольная сумма = 496575839; элементов - 998974; время выполнения = 3888 микросекунд
2018.11.14 03:26:49.212 ArrayDeleteValue (BTCUSD,M15)   вариант Peter:     Контрольная сумма = 496575839; элементов - 998974; время выполнения = 7597 микросекунд
附加的文件:
 
Алексей Тарабанов:
当你懒得写代码时,这就很糟糕了。

这根本不是说我懒惰,而是MT只在VDS上,你不在上面做实验。

关于这一点。

template <typename T>
int arrayFilter(const  T &arr[], const T x)
{
        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--];
                } else break;
        }
        ArrayResize(j+1);
        return j+1;
}

+- 1 :-) 我过几天就从夏令营回来了,我会去看看...

此外,在代码中,终止时有一个额外的循环条目......这是个小问题,但它可以被删除。

 
Maxim Kuznetsov:

这根本不是说我懒惰,而是MT只在VDS上,你不在上面做实验。

关于这一点。

+- 1 :-) 我过几天从乡下回来,我会去看看......

另外,在代码中,最后的循环有额外的输入......小事一桩,但可以删除。

好样的!在纠正了几个错误后,即使不使用ArrayCopy,你也可能把我从基座上打下来了。将军。:))

template <typename T>
int arrayFilter3(T &arr[], const T x)  // вариан Kuznetsov
{
        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--];
                } else break;
        }
        ArrayResize(arr,j+1);
        return j+1;
}
2018.11.14 03:48:29.572 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 131929 микросекунд
2018.11.14 03:48:29.576 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2411 микросекунд
2018.11.14 03:48:29.579 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 1839 микросекунд
2018.11.14 03:48:29.581 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 782 микросекунд
2018.11.14 03:48:29.585 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 496206996; элементов - 999002; время выполнения = 2813 микросекунд
2018.11.14 03:48:29.590 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 496206996; элементов - 997969; время выполнения = 4200 микросекунд
2018.11.14 03:48:29.596 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 496206996; элементов - 999002; время выполнения = 3597 микросекунд
2018.11.14 03:48:29.604 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 496206996; элементов - 999002; время выполнения = 7684 микросекунд
2018.11.14 03:48:29.606 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 496206996; элементов - 999002; время выполнения = 681 микросекунд
附加的文件:
 
Nikolai Semko:

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

虽然不完全是这样,因为输出阵列是相当不同的--已经混合。但无论如何,它是很酷的!

当然,如果我们处理的是报价,这将不起作用。我又站在了讲台上。))

我改变了计算校验和的方式。不再是所有元素的简单相加,而是相加为(元素值)/(元素数)。
这就是我得到的东西。

2018.11.14 04:20:26.063 ArrayDeleteValue (USDRUB,M1)    вариант Pastushak: Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 132291 микросекунд
2018.11.14 04:20:26.067 ArrayDeleteValue (USDRUB,M1)    вариант Korotky:   Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2322 микросекунд
2018.11.14 04:20:26.071 ArrayDeleteValue (USDRUB,M1)    вариант Fedoseev:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 1831 микросекунд
2018.11.14 04:20:26.074 ArrayDeleteValue (USDRUB,M1)    вариант Semko:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 773 микросекунд
2018.11.14 04:20:26.079 ArrayDeleteValue (USDRUB,M1)    вариант Pavlov:    Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 2879 микросекунд
2018.11.14 04:20:26.085 ArrayDeleteValue (USDRUB,M1)    вариант Nikitin:   Контрольная сумма = 7093.903216084301; элементов - 998017; время выполнения = 3605 микросекунд
2018.11.14 04:20:26.090 ArrayDeleteValue (USDRUB,M1)    вариант Vladimir:  Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 3622 микросекунд
2018.11.14 04:20:26.100 ArrayDeleteValue (USDRUB,M1)    вариант Peter:     Контрольная сумма = 7090.600736767353; элементов - 999003; время выполнения = 7252 микросекунд
2018.11.14 04:20:26.102 ArrayDeleteValue (USDRUB,M1)    вариант Kuznetsov: Контрольная сумма = 7085.49357433088;  элементов - 999003; время выполнения = 691 микросекунд
附加的文件: