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

 
Не знаю как поведет себя с
ArraySetAsSeries(array,true);
В последнем варианте сделал проверку и на него. Кому нужно могут использовать.
Файлы:
 
Реter Konow:

Верно. Но откуда мы знаем, что предоставленные алгоритмы не оставляют пустых мест? Контрольная сумма этого не доказывает. Количество элементов тоже. Ведь функция считает элементы, которые были до изменения размера массива. 

Почти во всех представленных это реализуется без проблем отправкой запроса с NULL.

Реter Konow:

Есть еще требование к алгоритму, - правильное размещение элементов внутри массива, после удаления ненужных элементов. Эта проверка должна была быть осуществлена вначале. Потом, проверка на скорость.

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

P.S. Ну и так к слову. В моей функции некоторые проверки прописаны, но не используются. Но в ней все это и больше уже заложено.

 

Я не ставлю под сомнение профессионализм участников и занятые ими места. Я всего лишь указал на дефект имеющийся в проверке контрольной суммой и также, на необходимость дополнительной проверки правильности расположения элементов в новом массиве.

Если это все правильно, то я заслуженно занял предпоследнее место.

В своей практике, я редко задумываюсь о скорости конкретных операций. Меня чаще волнует сжатость и понятность решения. Для меня было сюрпризом, что эта запись:

if(Arr[q]==val){deleted++; q--;}

может тормозить.

Однако, если прибавить еще один критерий оценки алгоритмов, - Сжатость решения, то я пожалуй на первом месте.

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

Хотя, вариант Федосеева, еще более сжатый, чем мой.
 
Реter Konow:

Однако, если прибавить еще один критерий оценки алгоритмов, - Сжатость решения, то я пожалуй на первом месте.

Твой вариант главного цикла:

for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val)
        {
         deleted++; 
         q--;
        }
      q++;
     }

а это Федосеева:

for(;i<sz;i++)
     {
      if(a[i]!=v)
        {
         a[j]=a[i];
         j++;
        }
     }

Оба варианта делают тоже самое. У кого лаконичней?

 
Nikolai Semko:

Твой вариант главного цикла:

а это Федосеева:

Оба варианта делают тоже самое. У кого лаконичней?

У него. У него вместо 

for(int a1=0; a1<ArraySize(Arr); a1++)
for(;i<sz;i++)

Это лаконичней.))

 
Реter Konow:

У него. У него вместо 

Это лаконичней.))

это как раз для компилятора одно и тоже.

У тебя просто Петр куча лишнего, поэтому и работает медленнее всех(первый вариант из топика вообще не рассматриваю)

У Федосеева в одном проходе цикла одна проверка, одно присвоение и одно приращение.(проверку и приращение при организации цикла не считаю).

У тебя же две проверки, одна сумма двух переменных, три приращения и одно присвоение.

 
for(int a1=0; a1<ArraySize(Arr); a1++)

Вся надежда на оптимизацию компилятором, иначе ArraySize выполняется на каждой итерации.

 
Aleksey Lebedev:

Вся надежда на оптимизацию компилятором, иначе ArraySize выполняется на каждой итерации.

Да, компилятор, судя по всему, проверяет, что если размерность массива в цикле не меняется, то самостоятельно заменяет эту функцию одним значением, вычислив эту функцию лишь однин раз. 
Во всяком случае если сделать такое:

const int size=ArraySize(Arr);
for(int a1=0; a1<size; a1++)

время выполнения функции не изменится. 

Поэтому для большей компактности имеет смысл писать именно так, как сделал это Пётр :)
Но согласен, лично мне это тоже режет глаза. Ощущение что функция будет вызываться каждый раз. 

 
Nikolai Semko:

Но согласен, лично мне это тоже режет глаза. Ощущение что функция будет вызываться каждый раз. 

imho лучше не давать компилятору выбора)

Позвольте спросить,

if(count>6) { ArrayCopy

больше шести - значение получено методом научного тыка, иль какое обоснование есть?)
 
Aleksey Lebedev:

imho лучше не давать компилятору выбора)

Позвольте спросить,

if(count>6) { ArrayCopy

больше шести - значение получено методом научного тыка, иль какое обоснование есть?)

Да, именно он. Метод научного тыка. На самом деле по моим наблюдениям от 5 до 8. Можно автоматизировать этот процесс, выполняя каждый раз автонастройку этого числа. Ведь на разных процессорах и системах это число может быть разным.

Например, если в классе CCanvas поменять все ArrayCopy и ArrayFill по такому принципу, то можно получить неплохой выигрыш в скорости канваса.

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