2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090 2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
是的,谢谢。纠正了。
int ArrayDeleteVal(int &a[],constint val) // вариант Semko
{
int size=ArraySize(a);
int i=0,start,s,count;
while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением valif(i==size) return size;
start=i; i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i==size) {ArrayResize(a,0); return0;}
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 элементов, то имеет смысл воспользоваться ArrayCopyelsefor(; s<i; start++,s++) a[start]=a[s]; // иначе простой циклif(i==size) break;
i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i<size) s=i; elsebreak;
i++;
}
if(start<size) ArrayResize(a,start); else start=size;
return(start);
}
只是你在某处也有一个错误,因为校验和不一致,因为某处缺少一个元素。没有在哪里工作过。
2018.11.1310:07:27.757 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 156757 микросекунд
2018.11.1310:07:27.761 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2338 микросекунд
2018.11.1310:07:27.764 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 1839 микросекунд
2018.11.1310:07:27.766 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 782 микросекунд
2018.11.1310:07:27.770 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 495781718; элементов - 999026; время выполнения = 2886 микросекунд
2018.11.1310:07:27.773 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2355 микросекунд
for(int i=0; i<1000000;i++) arr[i]=rand()%3;// 1000; //генерируем исходный массив случайными значениями от 0 до 1000int Value=rand()%3; // 1000; // значение, которое нужно удалить из массива
结果就是这样。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checksum = 333586; elements - 667421; execution time = 108521 microseconds 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checksum = 333586; elements - 667421; execution time = 5525 microseconds 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checksum = 333586; elements - 667421; execution time = 4879 microseconds 2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checksum = 333586; elements - 667421; execution time = 14479 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checksum = 998744; elements - 667421; execution time = 0 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checksum = 333586; elements - 667421; execution time = 5759 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checksum = 333586; elements - 667421; execution time = 1542 microseconds
2018.11.1312:35:38.633 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 131964 микросекунд
2018.11.1312:35:38.636 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2310 микросекунд
2018.11.1312:35:38.639 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 1834 микросекунд
2018.11.1312:35:38.641 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 773 микросекунд
2018.11.1312:35:38.645 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2815 микросекунд
2018.11.1312:35:38.648 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2475 микросекунд
2018.11.1312:35:38.653 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 496656342; элементов - 999011; время выполнения = 3608 микросекунд
我不知道mt4是什么,它甚至不能在win10上运行,我想这是件好事。
我调整了阵列。
我不得不使用ArrayCopy ,因为MQL5发誓说数组是静态的。
如果是这样的速度竞赛,我将提供我自己的变体......
你的变体确实是最快的,但它包含一个错误:如果一个数组的 所有元素 都等于一个过滤器,你的函数将退出该数组。
我将提供我自己的变体,它比你的要慢一点。
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
几年来,你一直在问这类问题。你学到了很多吗?对不起,但很明显,你还停留在字节和初级数 组的水平上。
这个问题本身的表述是不正确的。任务不是删除重复的值(高考水平的任务),而是在更大的事情上,你必须更新有效项目的列表。如果是这样,这个问题听起来应该完全不同。你混淆和误导了参与者,首先是你自己:把错误的解决方案强加给参与者,并要求使其有效。
我不是为了编程而编程,我的目标不是成为一个巨型程序员和在论坛上耍小聪明。
在这个问题中,你有什么不明白的地方:清除一个定义元素的数组?
你的变体确实是最快的,但它包含一个错误:如果一个数组的 所有元素 都等于一个过滤器,你的函数将退出该数组。
我推荐我的变体,它比你的要慢一些。
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1) test alien=1464941
是的,谢谢。纠正了。
只是你在某处也有一个错误,因为校验和不一致,因为某处缺少一个元素。没有在哪里工作过。
通过删除不必要的段落对其进行了调整
在这两种情况下,每个元素最多只被拖动一次。
是的,对不起,确实有一次。 我希望有人会对DBMS的方法感兴趣,并查看它,没有等到。不得不自己动手了。
将ArrayDeleteValue.mq5 插入你的检查器中,它比你的检查器坏两倍。我想了想原因,修改了其中的两行,使三分之一的项目被删除,而不是0.1%。
结果就是这样。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checksum = 333586; elements - 667421; execution time = 108521 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checksum = 333586; elements - 667421; execution time = 5525 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checksum = 333586; elements - 667421; execution time = 4879 microseconds
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checksum = 333586; elements - 667421; execution time = 14479 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checksum = 998744; elements - 667421; execution time = 0 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checksum = 333586; elements - 667421; execution time = 5759 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checksum = 333586; elements - 667421; execution time = 1542 microseconds
巴甫洛夫的变体有一个错误,我不得不把它注释出来。
结论:计算数组中的地址,其数字之间有任意的距离,仍然不如处理一行中的元素,在给定的步骤中,更不是步骤1,编译器可以优化它。
P.S. Borland的Pascal和Delphi编译器使得在运行时,循环变量并不重要(在内存中),它被放在CPU寄存器中的某个地方。
是的,对不起,确实有一次。 我希望有人会对DBMS的方法感兴趣,并查看它,没有等到。不得不自己动手了。
将ArrayDeleteValue.mq5 插入你的检查器中,它比你的检查器坏两倍。我想了想原因,在其中修改了两行,这样三分之一的项目将被删除,而不是0.1%。
结果就是这样。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checksum = 333586; elements - 667421; execution time = 108521 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checksum = 333586; elements - 667421; execution time = 5525 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checksum = 333586; elements - 667421; execution time = 4879 microseconds
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checksum = 333586; elements - 667421; execution time =14479 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checksum = 998744; elements - 667421; execution time = 0 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checksum = 333586; elements - 667421; execution time = 5759 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checksum = 333586; elements - 667421; execution time = 1542 microseconds
巴甫洛夫的变体有一个错误,我不得不把它注释出来。
结论:计算数组中的地址,其数字之间有任意的距离,仍然比在某一步骤中处理一行中的项目要差,在第1步时更是如此,编译器可以优化它。
P.S. Borland的Pascal和Delphi编译器使得在运行时,循环变量并不重要(在内存中),它被放在CPU寄存器中的某个地方。
巴甫洛夫的版本已被纠正。
你的价值观很奇怪。也许你在剖析或调试器后运行了脚本,而没有重新编译代码?
这就是我的工作方式。
而在你的版本中,它生成了一个不正确的校验和。而创建一个额外的数组根本没有任何好处,相反,它拖慢了进程,吞噬了额外的资源。
只是在我的例子中,它是在块中使用ArrayCopy 完成的,所以有一个速度上的优势。