Nikolai Semko: По сути у всех алгоритмы одинаковые. Все выполняют модификацию массива поэлементно и все стремятся к варианту Федосеева, т.к. у него нет ничего лишнего. Только у меня это происходит блоками с помощью ArrayCopy, поэтому выйгрыш в скорости и существует.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
Подумал о причинах и поправил в ней две строчки, чтобы удалялась треть элементов, а не 0.1%.
Вывод: вычисление адресов в массиве с произвольным расстоянием между их номерами все же хуже, чем обработка элементов подряд, при заданном шаге, тем более шаге 1, компилятор может ее оптимизировать.
А я понял, о чем Вы. Как-то пропустил эту фразу Да, конечно это понятно, но все равно, даже когда нужно выкидывать каждый третий элемент (тогда перестает работать у меня ArrayCopy и выигрыш исчезает) картина у меня другая:
2018.11.1313:46:01.524 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 332864; элементов - 667202; время выполнения = 66640 микросекунд
2018.11.1313:46:01.531 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5932 микросекунд
2018.11.1313:46:01.537 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5142 микросекунд
2018.11.1313:46:01.544 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5831 микросекунд
2018.11.1313:46:01.552 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 332864; элементов - 667202; время выполнения = 5493 микросекунд
2018.11.1313:46:01.563 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 958449; элементов - 667202; время выполнения = 11026 микросекунд
У Павлова действительно нерабочий вариант, но у Вас тоже то правильную контрольную сумму выдает, то неправильную.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
А я так и не понял полет его фантазии. Готовой функции то он так и не предоставил. А если допишу за него, снова меня обвинит, что я там все переделал. ))
А я так и не понял полет его фантазии. Готовой функции то он так и не предоставил. А если допишу за него, снова меня обвинит, что я там все переделал. ))
Ну, глядя на его код с мобилы, посетило ощущение, что он пишет "прямолинейно". Потому и не предоставил функцию - у него всё подряд идёт. И в его скрипте не функция, а прямолинейный код. Понятно, что такой скрипт может не подразумевать функцию, но ... Думаю, ему goto сильно не хватает для его полётов :)
Вариант Павлова исправил. Странные у вас значения получились. Может Вы скрипт запускали после профилирования или отладчика, не перекомпилировав код? У меня так получается:
Причем в Вашем варианте выдает неправильную контрольную сумму. Да и вообще создание дополнительного массива не дает никакой выгоды, а наоборот тормозит процесс, да еще и дополнительные ресурсы ест.
Поправил.
int ArrayDelV(int &a[],constint val)
{ // вариант Vladimirbool 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.
А создание дополнительного массива должно снижать продолжительность собственно транзакции массового удаления лишних, сохраняя массив неизменным вплоть до необходимого момента ее начала. Пока о сохранности данных речь здесь не шла.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
Все таки осилил вариант Петра.
int PeterArray(int &Arr[],constint 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.1314:08:32.857 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 150492 микросекунд
2018.11.1314:08:32.861 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2441 микросекунд
2018.11.1314:08:32.865 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 1852 микросекунд
2018.11.1314:08:32.867 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 779 микросекунд
2018.11.1314:08:32.871 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 2374 микросекунд
2018.11.1314:08:32.876 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 3720 микросекунд
2018.11.1314:08:32.885 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 495882514; элементов - 999010; время выполнения = 7266 микросекунд
:-) если не пытаться сохранять порядок, то время O(1) , общее число шагов всех циклов=размер массива
правдо кодить лень :-)
1. ищем первую 3-ку слева направо.
2. если нашли, то ищем не-тройку справа-налево., найденное копируем на место 3-ки.
продолжаем пока 1,2 не пересекутся, обрезаем массив по числу копирований.
идейно это ровно 1/2 от "сортировки пузырьком" :-) если вместо копирования, делать swap то на выходе получается частично упорядоченный массив (все 3-йки перемещены вправо)
Извините, говорят, что Вы хороший маркетолог, но программист... даже хуже меня.
1. Внутренняя целочисленная переменная deleted не инициализирована, значит будет равна нулю, но не гарантированно. В цикле смещение назад не произойдет (первый раз) сразу по двум причинам - угадайте, каким.
2. (главное) Вы сначала смещаете элементы массива, затем увеличиваете значение переменной deleted, а после будет цикл и следующее смещение произойдет на единицу более, чем надо. Иначе говоря, Ваш код будет лавинообразно уничтожать исходный массив.
Крайние варианты: В массиве нет ни одного лишнего элемента:
2018.11.1314:44:33.512 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 137515 микросекунд
2018.11.1314:44:33.514 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1408 микросекунд
2018.11.1314:44:33.517 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1807 микросекунд
2018.11.1314:44:33.519 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 672 микросекунд
2018.11.1314:44:33.522 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 1433 микросекунд
2018.11.1314:44:33.527 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4025 микросекунд
2018.11.1314:44:33.533 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 496983086; элементов - 1000000; время выполнения = 4297 микросекунд
В массиве все лишние элементы:
2018.11.1314:47:15.338 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 2000000000; элементов - 0; время выполнения = 2093 микросекунд
2018.11.1314:47:15.341 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 0; элементов - 0; время выполнения = 2257 микросекунд
2018.11.1314:47:15.343 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 0; элементов - 0; время выполнения = 1078 микросекунд
2018.11.1314:47:15.345 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 0; элементов - 0; время выполнения = 665 микросекунд
2018.11.1314:47:15.348 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 0; элементов - 0; время выполнения = 1580 микросекунд
2018.11.1314:47:15.353 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 0; элементов - 0; время выполнения = 4064 микросекунд
2018.11.1314:47:15.362 ArrayDeleteValue (EURUSD,D1) вариант Peter: Контрольная сумма = 0; элементов - 0; время выполнения = 7982 микросекунд
По сути у всех алгоритмы одинаковые. Все выполняют модификацию массива поэлементно и все стремятся к варианту Федосеева, т.к. у него нет ничего лишнего.
Только у меня это происходит блоками с помощью ArrayCopy, поэтому выйгрыш в скорости и существует.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
Подумал о причинах и поправил в ней две строчки, чтобы удалялась треть элементов, а не 0.1%.
Вывод: вычисление адресов в массиве с произвольным расстоянием между их номерами все же хуже, чем обработка элементов подряд, при заданном шаге, тем более шаге 1, компилятор может ее оптимизировать.
А я понял, о чем Вы. Как-то пропустил эту фразу
Да, конечно это понятно, но все равно, даже когда нужно выкидывать каждый третий элемент (тогда перестает работать у меня ArrayCopy и выигрыш исчезает) картина у меня другая:
У Павлова действительно нерабочий вариант, но у Вас тоже то правильную контрольную сумму выдает, то неправильную.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
А я так и не понял полет его фантазии. Готовой функции то он так и не предоставил. А если допишу за него, снова меня обвинит, что я там все переделал. ))
А я так и не понял полет его фантазии. Готовой функции то он так и не предоставил. А если допишу за него, снова меня обвинит, что я там все переделал. ))
Ну, глядя на его код с мобилы, посетило ощущение, что он пишет "прямолинейно". Потому и не предоставил функцию - у него всё подряд идёт. И в его скрипте не функция, а прямолинейный код. Понятно, что такой скрипт может не подразумевать функцию, но ... Думаю, ему goto сильно не хватает для его полётов :)
Но это лишь мои ощущения.
Вариант Павлова исправил.
Странные у вас значения получились. Может Вы скрипт запускали после профилирования или отладчика, не перекомпилировав код?
У меня так получается:
Причем в Вашем варианте выдает неправильную контрольную сумму. Да и вообще создание дополнительного массива не дает никакой выгоды, а наоборот тормозит процесс, да еще и дополнительные ресурсы ест.
Поправил.
Прогнал несколько раз, результаты болтаются - компьютер сильно загружен, освободится лишь в субботу. Лучше проверить у кого-нибудь другого. Но контрольная сумма теперь совпадает. Для сильно разреженных ненужных значений (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.
А создание дополнительного массива должно снижать продолжительность собственно транзакции массового удаления лишних, сохраняя массив неизменным вплоть до необходимого момента ее начала. Пока о сохранности данных речь здесь не шла.
А что там у Петра? Всех "порвал" ? Никто не вставил его код в проверялку. Интересно же как, и насколько он всех разметал по доске.
Все таки осилил вариант Петра.
вполне себе компактный и даже правильно работает. Респект Петру.
Но по скорости занимает второе место с конца. Или первое место с конца если не считать изначальный совсем негодный по скорости вариант хозяина этой ветки.
:-) если не пытаться сохранять порядок, то время O(1) , общее число шагов всех циклов=размер массива
правдо кодить лень :-)
1. ищем первую 3-ку слева направо.
2. если нашли, то ищем не-тройку справа-налево., найденное копируем на место 3-ки.
продолжаем пока 1,2 не пересекутся, обрезаем массив по числу копирований.
идейно это ровно 1/2 от "сортировки пузырьком" :-) если вместо копирования, делать swap то на выходе получается частично упорядоченный массив (все 3-йки перемещены вправо)
Еще доработка:
Извините, говорят, что Вы хороший маркетолог, но программист... даже хуже меня.
1. Внутренняя целочисленная переменная deleted не инициализирована, значит будет равна нулю, но не гарантированно. В цикле смещение назад не произойдет (первый раз) сразу по двум причинам - угадайте, каким.
2. (главное) Вы сначала смещаете элементы массива, затем увеличиваете значение переменной deleted, а после будет цикл и следующее смещение произойдет на единицу более, чем надо. Иначе говоря, Ваш код будет лавинообразно уничтожать исходный массив.
В массиве нет ни одного лишнего элемента:
В массиве все лишние элементы:
Извините, говорят, что Вы хороший маркетолог, но программист... даже хуже меня.
Алексей, вы прям таки убиваете юный талант...
этот маркетолог 5 лет не может начать продавать..а вы говорите что как программист он ещё хуже :-)