Ну это не серьезно. Если притягивать слонов для решения конкретно этой мелкой задачи, то я бы упомянул STL::remove(array, value).
Это как раз очень серьёзно и фундаментально. MQL просто многословен. До ужаса.
Такие основополагающие операторы как filter (а у ТС это же он, фильтрация), map (отображение), fold (свёртка, суммарный итог) должны реализовываться на раз, и без вопросов. И быть оптимизированы.
Это как раз очень серьёзно и фундаментально. MQL просто многословен. До ужаса.
Такие основополагающие операторы как filter (а у ТС это же он, фильтрация), map (отображение), fold (свёртка, суммарный итог) должны реализовываться на раз, и без вопросов. И быть оптимизированы.
Речь о том, что тянуть такую жирную ("фундаментальную") зависимость для мелкой задачки - нонсенс. Если писать всё по-уму и рефакторить весь проект целиком - тогда, конечно, но это не суть исходного вопроса.
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо; 2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n); 3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо; 2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n); 3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
Результат выполнения:
Красным выделены недействительные значения, которые так и не были удаленны из массива.
Дзюблик? Пусть так. Сравнивать переменные типа double очень даже комильфо, если они не вычислены перед сравнением.
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо; 2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n); 3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
Результат выполнения:
Красным выделены недействительные значения, которые так и не были удаленны из массива.
Да не несите чушь. Объяснить вам вашу ошибку, или сами догадаетесь? Вообще не сложно...
Три пункта - три загона. Хотя, нет, только два загона.
ps но я в вас верю
ps2 вот какой результат если пользоваться функцией правильно:
Ну если уж пошла такая пьянка-соревновалка по скорости, то предложу и свой вариант:
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);
}
Написал тестовый скрипт на все варианты. Вот результат для массива размерностью в 1 000 000 элементов (лишних значений около 1000):
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 (а у ТС это же он, фильтрация), map (отображение), fold (свёртка, суммарный итог)
должны реализовываться на раз, и без вопросов. И быть оптимизированы.
Это как раз очень серьёзно и фундаментально. MQL просто многословен. До ужаса.
Такие основополагающие операторы как filter (а у ТС это же он, фильтрация), map (отображение), fold (свёртка, суммарный итог)
должны реализовываться на раз, и без вопросов. И быть оптимизированы.
Речь о том, что тянуть такую жирную ("фундаментальную") зависимость для мелкой задачки - нонсенс. Если писать всё по-уму и рефакторить весь проект целиком - тогда, конечно, но это не суть исходного вопроса.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Очистка массива от заданного (ых) элементов
Dmitry Fedoseev, 2018.11.12 23:05
Это какой-то позор... ©
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо;
2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n);
3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
Результат выполнения:
Красным выделены недействительные значения, которые так и не были удаленны из массива.
Это какой-то позор... ©
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо;
2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n);
3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
Результат выполнения:
Красным выделены недействительные значения, которые так и не были удаленны из массива.
Дзюблик? Пусть так. Сравнивать переменные типа double очень даже комильфо, если они не вычислены перед сравнением.
Учите матчасть. Что там, насчет позора?
Это какой-то позор... ©
1. Сравнивать переменные типа double через ==, мягко говоря, не комильфо;
2. Сложность кода O(n^2), при этом худшая сложность для данной задачи с не отсортированной входной последовательностью должна быть O(n);
3. Код не рабочий, так как при реальном использовании функции не возможно определить сколько действительных значений содержит возвращаемый массив:
Результат выполнения:
Красным выделены недействительные значения, которые так и не были удаленны из массива.
Да не несите чушь. Объяснить вам вашу ошибку, или сами догадаетесь? Вообще не сложно...
Три пункта - три загона. Хотя, нет, только два загона.
ps но я в вас верю
ps2 вот какой результат если пользоваться функцией правильно:
Вот так лучше:
Вот так лучше:
Дмитрий, расстрою - v - тоже массив.
И вообще, все это - полная ерунда.
Дмитрий, расстрою - v - тоже массив.
И вообще, все это - полная ерунда.
Если v массив - это не проблема. А то, что ерунда - скорее да. У меня вот ни разу не возникало потребности в решении это задачи.
Ну если уж пошла такая пьянка-соревновалка по скорости, то предложу и свой вариант:
Написал тестовый скрипт на все варианты.
Кто следующий? :))Вот результат для массива размерностью в 1 000 000 элементов (лишних значений около 1000):
Пётр, Ауууу....