Очистка массива от заданного (ых) элементов - страница 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) вариант Pastushak: Контрольная сумма = 497057781; элементов - 998984; время выполнения = 418662 микросекунд
2018.11.13 21:35:16.898 del_2 (GBPUSD.m,H1) вариант Korotky:   Контрольная сумма = 497057781; элементов - 998984; время выполнения = 10683 микросекунд
2018.11.13 21:35:16.918 del_2 (GBPUSD.m,H1) вариант Fedoseev:  Контрольная сумма = 497057781; элементов - 998984; время выполнения = 9740 микросекунд
2018.11.13 21:35:16.928 del_2 (GBPUSD.m,H1) вариант Semko:     Контрольная сумма = 497057781; элементов - 998984; время выполнения = 4691 микросекунд
2018.11.13 21:35:16.944 del_2 (GBPUSD.m,H1) вариант Pavlov:    Контрольная сумма = 497057781; элементов - 998984; время выполнения = 12512 микросекунд
2018.11.13 21:35:16.957 del_2 (GBPUSD.m,H1) вариант Nikitin:   Контрольная сумма = 497057781; элементов - 998984; время выполнения = 10720 микросекунд
2018.11.13 21:35:16.978 del_2 (GBPUSD.m,H1) вариант Vladimir:  Контрольная сумма = 497057781; элементов - 998984; время выполнения = 17197 микросекунд

для трети

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) вариант Korotky:   Контрольная сумма = 668222; элементов - 667065; время выполнения = 4757 микросекунд
2018.11.13 21:57:17.848 del_2 (GBPUSD.m,H1) вариант Fedoseev:  Контрольная сумма = 668222; элементов - 667065; время выполнения = 4815 микросекунд
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) вариант Semko:     Контрольная сумма = 668222; элементов - 667065; время выполнения = 5812 микросекунд
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) вариант Pavlov:    Контрольная сумма = 1001157; элементов - 667065; время выполнения = 0 микросекунд
2018.11.13 21:57:17.858 del_2 (GBPUSD.m,H1) вариант Nikitin:   Контрольная сумма = 668222; элементов - 667065; время выполнения = 4749 микросекунд
2018.11.13 21:57:17.868 del_2 (GBPUSD.m,H1) вариант Vladimir:  Контрольная сумма = 668222; элементов - 667065; время выполнения = 9814 микросекунд
У Pavlov опять сбой.

Скорее всего, мой вывод об ускорении прохода по циклу 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 от "сортировки пузырьком" :-) если вместо копирования, делать swap то на выходе получается частично упорядоченный массив (все 3-йки перемещены вправо)

 
Реter Konow:

Еще доработка:

Извините, говорят, что Вы хороший маркетолог, но программист... даже хуже меня. 

1. Внутренняя целочисленная переменная deleted не инициализирована, значит будет равна нулю, но не гарантированно. В цикле смещение назад не произойдет (первый раз) сразу по двум причинам - угадайте, каким. 

2. (главное) Вы сначала смещаете элементы массива, затем увеличиваете значение переменной deleted, а после будет цикл и следующее смещение произойдет на единицу более, чем надо. Иначе говоря, Ваш код будет лавинообразно уничтожать исходный массив. 

 
Крайние варианты:
В массиве нет ни одного лишнего элемента:
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 лет не может начать продавать..а вы говорите что как программист он ещё хуже :-)

Причина обращения: