Здравствуйте, Дарней, Вы писали:
Д>Похоже, никто так и не понял, что я хотел сказать.
Д>Мне тоже не нравятся рутинные задачи. Но выжиманием скорости ради развлечения я давно не занимался и не собираюсь. Потому что это та же самая рутина.
"Выжимание скорости" бывает разым. Вот простейшая иллюстрация — надо удалить все пробелы из Сишной строки.
Реализация раз, индуссого типа:
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 или методами в классе строки. Но принцип от этого не изменяется. Есть бесчисленное множество других задач, которые не решаются стандартными методами. И вот алгоритмический анализ и сокращение сложности там, где это принципиально возможно — это очень сильное колдунство. Оно не может быть рутиной по определению, оно может лишь не являться необходимым. Но такие задачи, в которых алгоритмическая оптимизация является несущественной, не вызывают у меня ни малейшего интереса.