Re[7]: Об эффективности - с другой стороны
От: McSeem2 США http://www.antigrain.com
Дата: 20.11.05 18:36
Оценка: 19 (3) +1
Здравствуйте, Дарней, Вы писали:

Д>Похоже, никто так и не понял, что я хотел сказать.

Д>Мне тоже не нравятся рутинные задачи. Но выжиманием скорости ради развлечения я давно не занимался и не собираюсь. Потому что это та же самая рутина.

"Выжимание скорости" бывает разым. Вот простейшая иллюстрация — надо удалить все пробелы из Сишной строки.
Реализация раз, индуссого типа:
for(i = 0; i < strlen(str); i++)
{
   if(str[i] == ' ') { strcpy(str + i, str + i + 1); i--; }
}


Знаешь, какова сложность данного цикла? O(N^3). Это значит, что на строке в 10 миллионов символов данный цикл не закончится никогда — врмени жизни Вселенной не хватит.

Реализация два, нормальная, O(N).
for(i = j = 0; str[i]; i++)
{
   if(str[i] != ' ') str[j++] = str[i];
}
str[j] = 0;

(возможно, что я где-то ошибся, но это не важно для иллюстрации).


Это так называемая алгоритмическая оптимизация, оперирующая понятием О-нотации. На маленьких строках первый вариант будет работать тоже вполне быстро, но он начнет затыкаться как только размер превысит некий критический. Возможно, что этот критический размер никогда не будет превышен, а возможно что и будет — и тогда кирдык всей идее. Но заранее мы как правило не знаем этого. Да, иногда знаем и можем позволить себе схалтурить (куда ж без этого?).

Есть еще кодовая оптимизация, например, для данного случая — использовать адресную арифметику вместо индексной. Она тоже дает выигрыш, но соотношение усилия/эффект у него гораздо ниже. И это действительно рутиная работа (куда ж без нее?). И вот стереотип заключается в том, что большинство людей под оптимизацией подразумевают именно кодовую оптимизацию. Но для первого варианта никакая кодовая оптимизация не поможет. Это только в морг.

Прошу заметить, что данный пример является лишь иллюстрацией. Понятно, что современными средствами это делается по-другому, типа remove_if или методами в классе строки. Но принцип от этого не изменяется. Есть бесчисленное множество других задач, которые не решаются стандартными методами. И вот алгоритмический анализ и сокращение сложности там, где это принципиально возможно — это очень сильное колдунство. Оно не может быть рутиной по определению, оно может лишь не являться необходимым. Но такие задачи, в которых алгоритмическая оптимизация является несущественной, не вызывают у меня ни малейшего интереса.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.