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

 
Nikolai Semko:
从本质上讲,所有的算法都是一样的。每个人都在逐一修改数组的元素,每个人都在为费多谢夫的变体而努力,因为它没有任何多余的东西。
只是在我的例子中,它是用ArrayCopy在块中完成的,所以有一个速度上的优势。

那皮奥特呢?每个人都 "撕毁 "了吗?没有人把他的代码放在检查器里。我想知道他是如何,以及在多大程度上,把董事会的每个人都吹走了。

 
Vladimir:

我想了想原因,纠正了其中的两行,删除三分之一的元素,而不是0.1%。

结论:计算数组中的地址,其数字之间有任意的距离,仍然比在某一步骤中处理一行中的项目要差,在第1步时更是如此,编译器可以优化它。

哦,我明白你的意思了。不知怎的,我错过了这句话
是的,当然很清楚,但是,即使我不得不扔掉每三个元素(然后ArrayCopy 对我停止工作,赢利消失),情况也不一样。

2018.11.13 13:46:01.524 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 332864; элементов - 667202; время выполнения = 66640 микросекунд
2018.11.13 13:46:01.531 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5932 микросекунд
2018.11.13 13:46:01.537 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 332864; элементов - 667202; время выполнения = 5142 микросекунд
2018.11.13 13:46:01.544 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 332864; элементов - 667202; время выполнения = 5831 микросекунд
2018.11.13 13:46:01.552 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 332864; элементов - 667202; время выполнения = 5493 микросекунд
2018.11.13 13:46:01.563 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 958449; элементов - 667202; время выполнения = 11026 микросекунд

巴甫洛夫的变体确实不起作用,但你也有正确和不正确的校验。

附加的文件:
 
Artyom Trishkin:

那么彼得呢?你把它们都撕开了吗?没有人把他的代码插入检查器中。有趣的是,他是如何以及在多大程度上让董事会上的每个人都感到惊讶。

我还是不明白他的飞扬跋扈。他仍然没有提供一个现成的功能。如果我为他完成,他又会指责我重做一切。))

 
Nikolai Semko:

我还是不明白他的飞扬跋扈。他仍然没有提供一个现成的功能。如果我为他完成,他又会指责我重做一切。))

好吧,从手机上看他的代码,我的印象是他写得很 "直白"。这就是为什么他没有提供功能--他做什么都是一排排的。而且他的脚本不是一个函数,而是直接的代码。当然,这样的脚本可能不意味着有什么功能,但...我认为他的航班缺乏GOTO :)

但这只是我的感觉。

 
Nikolai Semko:

纠正了巴甫洛夫的变体。
你的价值观很奇怪。也许你在剖析或调试后运行了该脚本,而没有重新编译代码?
这就是我的工作方式。

而在你的变体中,它给出了错误的校验值。创建一个额外的阵列根本无利可图,相反,它减慢了进程并吞噬了额外的资源。

纠正了。

int ArrayDelV(int &a[],const int val)
  { // вариант Vladimir
   bool Flags[]; // массив пометок на удаление
   int N,NewN,i,j;
   N=ArraySize(a);
   ArrayResize(Flags,N);
   if (ArrayInitialize(Flags,false)!=N) return(-1);
   NewN=N; // Сколько останется
   for(i=0;i<N;i++) {if(a[i]==val) {Flags[i]=true; NewN--;}}
   j=0;
   for(i=0;i<N;i++) {if(!Flags[i]) {a[j]=a[i]; j++;}}
   ArrayResize(a,NewN);
   return(NewN);
  }

我已经运行了几次,结果是悬而未决--电脑真的很忙,要到星期六才有空。最好向其他人核实。但现在的校验和是匹配的。对于高度稀疏的不必要的值(0.1%)来说

2018.11.13 21:35:16.888 del_2 (GBPUSD.m,H1) option Pastushak: Checksum = 497057781; elements - 998984; execution time = 418662 microseconds
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) variant Korotky: Checksum = 497057781; elements - 998984; execution time = 10683 microseconds
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) variant Fedoseev: Checksum = 497057781; elements - 998984; execution time = 9740 microseconds
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) variant Semko: Checksum = 497057781; elements - 998984; execution time = 4691 microseconds
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) variant Pavlov: Checksum = 497057781; elements - 998984; execution time = 12512 microseconds
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) variant Nikitin: Checksum = 497057781; elements - 998984; execution time = 10720 microseconds
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) variant Vladimir: Checksum = 497057781; elements - 998984; execution time = 17197 microseconds

三分之一

2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1)变量Pastushak:校验和=668222;元素-667065;执行时间=65732微秒
2018.11.13 21:57:17.838 del_2 (GBPUSD.m,H1) variant Korotky: Checksum = 668222; elements - 667065; 执行时间 = 4757微秒
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) variant Fedoseev: Checksum = 668222; elements - 667065; execution time = 4815 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Semko: Checksum = 668222; elements - 667065; execution time = 5812 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Pavlov: Checksum = 1001157; elements - 667065; execution time = 0 microseconds
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) variant Nikitin: Checksum = 668222; elements - 667065; execution time = 4749 microseconds
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) variant Vladimir: Checksum = 668222; elements - 667065; execution time = 9814 microseconds
巴甫洛夫又崩溃了。

我关于加速循环for循环的结论对于MQL语言来说可能是不正确的。

而创建一个额外的数组应该通过移除多余的数组来减少交易本身的时间,保持数组不变,直到其开始的必要时刻。到目前为止,这里还没有谈及数据的完整性。

 
Artyom Trishkin:

彼得呢?他有没有 "撕毁 "所有人?没有人把他的代码放在检查器里。我想知道他是如何,以及在多大程度上,把董事会的每个人都吹走了。

但我已经设法拿到了彼得的版本。

int PeterArray(int &Arr[],const int val) // вариант Peter Konov
  {
   int deleted=0,q=0;
   for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize(Arr,q);
   return (q);
  }

它相当紧凑,甚至可以正常工作。向皮奥特致敬。
但就速度而言,他从头到尾排名第二。或者说,如果你不计算本线程的主人的原始的、完全不适合速度的版本,那么从最后的第一名。

2018.11.13 14:08:32.857 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 150492 микросекунд
2018.11.13 14:08:32.861 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2441 микросекунд
2018.11.13 14:08:32.865 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 1852 микросекунд
2018.11.13 14:08:32.867 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 779 микросекунд
2018.11.13 14:08:32.871 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2374 микросекунд
2018.11.13 14:08:32.876 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 495882514; элементов - 999010; время выполнения = 3720 микросекунд
2018.11.13 14:08:32.885 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 495882514; элементов - 999010; время выполнения = 7266 микросекунд
附加的文件:
 

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

懒得编码 :-)

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

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

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

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

 
Реter Konow:

更加细化。

对不起,他们说你是一个好的营销人员,但一个程序员...甚至比我更糟糕。

1.内部整数变量没有被初始化,所以它将是零,但不保证。在循环中,由于两个原因,向后移位将不会同时发生(第一次)--猜猜是哪一个。

2.(最重要的是)你首先转移数组元素,然后增加被删除的变量的值,然后会有一个循环,下一次转移会比必要时多发生一次。换句话说,你的代码将使原始数组雪崩。

 
极端的选择。
数组中没有多余的元素。
2018.11.13 14:44:33.512 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 137515 микросекунд
2018.11.13 14:44:33.514 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1408 микросекунд
2018.11.13 14:44:33.517 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1807 микросекунд
2018.11.13 14:44:33.519 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 672 микросекунд
2018.11.13 14:44:33.522 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1433 микросекунд
2018.11.13 14:44:33.527 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4025 микросекунд
2018.11.13 14:44:33.533 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4297 микросекунд
该数组有所有不必要的元素。
2018.11.13 14:47:15.338 ArrayDeleteValue (EURUSD,D1)    вариант Pastushak: Контрольная сумма = 2000000000; элементов - 0; время выполнения = 2093 микросекунд
2018.11.13 14:47:15.341 ArrayDeleteValue (EURUSD,D1)    вариант Korotky:   Контрольная сумма = 0; элементов - 0; время выполнения = 2257 микросекунд
2018.11.13 14:47:15.343 ArrayDeleteValue (EURUSD,D1)    вариант Fedoseev:  Контрольная сумма = 0; элементов - 0; время выполнения = 1078 микросекунд
2018.11.13 14:47:15.345 ArrayDeleteValue (EURUSD,D1)    вариант Semko:     Контрольная сумма = 0; элементов - 0; время выполнения = 665 микросекунд
2018.11.13 14:47:15.348 ArrayDeleteValue (EURUSD,D1)    вариант Nikitin:   Контрольная сумма = 0; элементов - 0; время выполнения = 1580 микросекунд
2018.11.13 14:47:15.353 ArrayDeleteValue (EURUSD,D1)    вариант Vladimir:  Контрольная сумма = 0; элементов - 0; время выполнения = 4064 микросекунд
2018.11.13 14:47:15.362 ArrayDeleteValue (EURUSD,D1)    вариант Peter:     Контрольная сумма = 0; элементов - 0; время выполнения = 7982 микросекунд
附加的文件:
 
Алексей Тарабанов:

对不起,他们说你是一个好的营销人员,但一个程序员...甚至比我更糟糕。


阿列克谢,你在扼杀一个年轻的人才......。

这个营销员已经5年没能开始销售了......而你说他作为一个程序员更糟糕 :-)