int ArrayDeleteVal(int &a[],constint 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 элементов, то имеет смысл воспользоваться 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.1219:50:02.965 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 156457 микросекунд
2018.11.1219:50:02.969 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 2319 микросекунд
2018.11.1219:50:02.972 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 1810 микросекунд
2018.11.1219:50:02.974 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495654091; элементов - 998983; время выполнения = 785 микросекунд
主要任务是清除定义值的数组。
这不能成为主要任务。在这个阵列中收集的是什么,然后如何使用它?
嗯,这并不严重。如果拉大象来解决这个特殊的小问题,我会提到STL::remove(array, value)。
这只是非常严肃和基本的。MQL只是啰嗦而已。糟糕的是。
基本运算符,如filter(在TC中是哪个,过滤),map(映射),fold(折叠,总结)。
应立即实施,不问问题。并进行优化。
这只是非常严重和根本的问题。MQL只是啰嗦而已。这很可怕。
像filter(在TC中是过滤)、map(映射)、fold(求和)这样的基本运算符
,应该立即实现,没有任何问题。并进行优化。
关键是,为一个小任务拉动如此庞大("基本")的依赖性是无稽之谈。如果要明智地写出一切,并重构整个项目--那么,当然,但这不是原来问题的本质。
关于交易、自动交易系统和交易策略测试的论坛
从指定的元素中清理一个数组
Dmitry Fedoseev, 2018.11.12 23:05
这是某种耻辱......©
1.通过==来比较double类型的变量,说句不好听的,这并不滑稽。
2.该代码的复杂度为O(n^2),在没有排序的输入序列中,这个问题的最差复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。
执行结果。
无效的值用红色突出显示,它们从未从数组中删除。
这是某种耻辱......©
1.说句不好听的,通过==来比较双倍类型的变量是不可取的。
2.代码复杂度为O(n^2),在未排序的输入序列中,这个问题的最坏情况复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。
执行结果。
从未从数组中删除的无效值以红色显示。
Jublik?那就这样吧。如果在比较之前不进行计算,比较双倍类型的 变量是相当滑稽的。
学习数学。羞耻心呢?
这是某种耻辱......©
1.用==来比较double类型的变量,说句不好听的,并不滑稽。
2.代码复杂度为O(n^2),在未排序的输入序列中,这个问题的最差复杂度应该是O(n)。
3.这段代码不起作用,因为在实际使用该函数时,不可能确定返回的数组包含多少个有效值。
执行结果。
从未从数组中删除的无效值以红色显示。
别傻了。要我向你解释你的错误,还是你自己能猜到呢?一点都不难...
三个点,三个畜栏。事实上,不,只有两个围场。
ps,但我对你有信心。
ps2 如果你正确使用这个函数,结果是这样的。
那就更好了。
那就更好了。
迪米特里,让我打乱你的思路--v也是一个数组。
而且无论如何,这完全是胡说八道。
迪米特里,让我打乱你的思路--v也是一个数组。
而总的来说,这一切完全是胡说八道。
如果v是一个数组,那就没有问题了。但事实上,它是无稽之谈的可能性更大。我从来没有觉得需要解决这个任务。
如果是这样的速度竞赛,我也会提供我自己的变体。
我为所有的变体写了一个测试脚本。
谁是下一个?:))下面是一个有1 000 000个元素的数组的结果(大约1000个额外的值)。
Peter, Awww....