Очистка массива от заданного (ых) элементов - страница 24

 

Вот лучшая версия, использующая двоичный поиск.

#include <Arrays\ArrayInt.mqh>
int array_filter(int &arr[], const int &filters[])
{
   int size_arr = ArraySize(arr);
   CArrayInt filterz;
   filterz.AssignArray(filters);
   filterz.Sort();
   int i=0, k=0;
   for(i=0; i<size_arr; i++)
      if(filterz.Search(arr[i]) < 0)
         arr[k++] = arr[i]; 
   return ArrayResize(arr, k); 
}


Я не говорю по-русски, я использую google translate.
 
jdjahfkahjf:

Он ведь не русский, трудно поймет. El habla espanol.

вот подмывало меня выучить испанский будучи проездом в тех местах, но как-то забросил..зря
 
template<typename T>
int arrayFilter(T &data[], const T value)
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          if( data[i] == value || data[i] == NULL )
          {
               result = true;
               s--;
               continue;
          }
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

template<typename T>
int arrayFilter(T &data[], const T &value[])
{
     bool ser = ArrayGetAsSeries( data ) ? ArraySetAsSeries(data, false) : false;
   
     int s, _s = s = ArraySize(data);
     bool result = false;
     
     for(int i=0, j=0; i<_s && !IsStopped(); i++)
     {
          bool p = false;
          for(int y=0; y<ArraySize(value); y++)
               if( data[i] == value[y] )
               {
                    result = true;
                    s--;
                    p = true;
                    break;
               }
          if( p )
               continue;
          
          if( result )
               data[j] = data[i];
          j++;
     }
     
     if(s < _s)
          if( ArrayResize(data, s) )
               if(ArraySize(data) == _s)
                    ArrayFill(data, s, _s-s, NULL);
     
     if( ser )
          ArraySetAsSeries(data, true);
     
     return s;
}

Как нужно так и можно вызвать в конечном итоге.

 
Konstantin Nikitin:

Как нужно так и можно вызвать в конечном итоге.

копию value[] отсортировать при входе в функцию и

с двоичным поиском всё побыстрее будет, тут испанец прав.

 
Maxim Kuznetsov:

копию value[] отсортировать при входе в функцию и

с двоичным поиском всё побыстрее будет, тут испанец прав.

Да не стал я голову забивать себе. По быстрому перекидал. Да и могут быть строковые массивы.

P.S. Надоело это развлечение. Пора делами заняться
 
Maxim Kuznetsov:

копию value[] отсортировать при входе в функцию и

с двоичным поиском всё побыстрее будет, тут испанец прав.

я бы использовал структуру данных HashSet для значений value.
Сложность будет: O(n) + O(m)

Для предлагаемого бинарного поиска, сложность будет: O(n log(m))

 

24 страницы - не понятно откуда темперамент и сколько можно перетирать примитивную задачу, взял скрипт с третьей страницы, т.к. дальше читать нет сил, добавил три строчки, инлайн без функций.

N=ArraySize(arr)-1;
for(int i=N;i>=0;i--) if(arr[i]==Value) arr[i]=arr[N--]; N++;
ArrayResize(arr,N);
2018.11.17 01:44:40.077 ArrayDeleteValue (EURUSD,H1)    вариант Pastushak: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 308973 микросекунд
2018.11.17 01:44:40.092 ArrayDeleteValue (EURUSD,H1)    вариант Korotky: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11531 микросекунд
2018.11.17 01:44:40.107 ArrayDeleteValue (EURUSD,H1)    вариант Fedoseev: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 11325 микросекунд
2018.11.17 01:44:40.114 ArrayDeleteValue (EURUSD,H1)    вариант Semko: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2819 микросекунд
2018.11.17 01:44:40.117 ArrayDeleteValue (EURUSD,H1)    вариант Inline: Контрольная сумма = 496597320; элементов - 999020; время выполнения = 2600 микросекунд

странно, но походу победил всех - "за пять минут и без никаких фокусов"(c) и пошел спать...)))

Файлы:
 
Ivan Negreshniy:

24 страницы - не понятно откуда темперамент и сколько можно перетирать примитивную задачу, взял скрипт с третьей страницы, т.к. дальше читать нет сил, добавил три строчки, инлайн без функций.

странно, но походу победил всех - "за пять минут и без никаких фокусов"(c) и пошел спать...)))

1. Вы взяли непонятно какой давности код, а это прямое неуважения к сообществу;
2. Внесли изменения в код, нагамнокодив где-то внутри, даже не вынося их в отдельную функцию;
3. Затем, по видимому, запустили код на тестирование производительности в DEBUG компиляции, так как и скорость исполнения и результаты не соответствуют RELEASE версии. 
4. При этом ваш код содержит ошибки и вообще не решает задачу. (Так как arr[N--] может содержать значение Value, которое не было ни отфильтровано, ни удалено).

Зато пафосом от такого "победителя"...

 

Ок. Пока работы нет безумный тест продолжается. Добавил новый тест по вектору и заодно включил @Ivan Negreshniy  вариант., смотрите, разбирайте свои ошибки, алгоритм у вас не рабочий.

Получилось такое

1

Файлы:
 

Небольшая оптимизация

P.S. исправил ошибки и заменил файл

Файлы: