Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Насколько важно уметь писать алгоритмы "с нуля"?
1
  1  Странник, 28 января 2020 г. 11:48:17
      Хорошо, буду пробовать.
  2  Егоров Илья Валерьевич, 26 января 2020 г. 2:32:34
      Имеет смысл задействовать все 3.

Пусть верны следующие положения (Пi):
1) Потом равносильно никогда (прокрастинация);
2) Копипаста мозгом игнорируется;
3) Интервальное повторение эффективно;
_) Применимы следующие "законы памяти":
~~ 4) закон повторения: воспроизведение информации без источника, даже мысленно, информацию в памяти укрепляет [проверено];
~~ 5) законы ретроактивного и проективного торможения: последовательно запоминание разного рода информации пагубно [проверено];
~~ 6) закон деятельности: обработка информации ведет к запоминанию [сомнительно].

Тогда можно предложить такую схему:
1) Берется определенная задача;
2) Если нужный для решения задачи алгоритм не изучен, то:
2.1) Алгоритм изучается: информация анализируется, осмысляется и, в силу П6, обрабатывается (алгоритм реализуется);
2.2) В силу П4, производится попытка сразу же воспроизвести алгоритм мысленно без источника;
3) Если с момента изучения алгоритма прошло, в силу П3, не менее 2X + 1 дней, где X — кол-во дней между моментом изучения и последнего повторения, то:
3.1) В силу П4, алгоритм реализуется с нуля самостоятельно (без подсказок);
3.2) Иначе, в силу П2, производится копипаста: по умственной деятельности это как библиотечную функцию вызвать;
4) Если в процессе оказывается, что требуется другой алгоритм, то:
4.1) В силу П5, делается короткий перерыв (~10 минут);
4.2) GOTO (2);
5) Решение проходит все тесты;
6) [опционально] В силу П1, производится сокращение кода решения, где как раз можно ограничиться библиотечными функциями: acmp — это про "меньший код = лучший код";
7) [опционально] В силу П1, производится улучшение решения по времени и памяти: это можно считать отдельным контестом, я так уже 2 года из-за 224 на этом пункте сижу;
8) Делается короткий перерыв, в силу П5;
9) GOTO (1);
  3  Странник, 25 января 2020 г. 23:31:54
      Спасибо вам за развернутый ответ, но у меня еще остались вопросы.
Рассмотрим конкретный пример:
Допустим я сейчал взял книжку по алгоритмам, и прочитал, понял и реализовал сортировку слиянием (например на си++). Решил я после этого потренироваться на задачах с acmp. Так вот, как мне их решать?:
- Для каждой задачи прописывать сортировку самостоятельно и без подсказок? (чтобы запомнить и развить скорость написания)
- Использовать copy&paste своей готовой реализации? (так проще фокусироваться на самих задачах + уйдет меньше времени на решение)
- #include<algorithm> sort(array, array + n); ???
  4  Егоров Илья Валерьевич, 25 января 2020 г. 21:58:50
      Иначе говоря, необходимость вытекает из условий. В тривиальных случаях необходимость стремится к нулю: кодер может обходиться без хорошего знания алгоритмов, но далеко так не уедет. Владеть не необходимо — программист все равно остается программистом. С другой стороны, если подразумевается конкретная вакансия, конкретное собеседование, то может возникнуть определенная планка, которую нужно перепрыгнуть. С началом работы она может как понизиться, так и снизиться. Увы, но степень владения человек определяет сам: если тема интересна, он может не останавливаться.
  5  Егоров Илья Валерьевич, 25 января 2020 г. 21:48:43
      ...вательно, нет нужды останавливаться.
  6  Егоров Илья Валерьевич, 25 января 2020 г. 21:48:30
      Лично я считаю, что оно может быть верно в тривиальных случаях, но в случае профессионального выживания заключение не является верным. Противное — непрофессионализм.

Есть множество таких примеров:
- Отсутствие готовых реализаций: характерно для конкретного системного программирования, при котором и libc может отсутствовать;
- Неприменимость существующих: можно радоваться библиотечным функциям до тех пор, пока не придется перейти на другой уровень абстракции;
- Неудовлетворенность текущей реализацией: по выделению памяти, по скорости, по любым другим параметрам;
- В учебных целях: чтоб научиться чему-то, полезно это самое реализовать и т.о. понять как оно работает;
- И ряд других причин написать алгоритм с нуля.

С другой стороны, не менее важным аспектом является выявление алгоритма:
- Во время рефакторинга какого-нибудь проекта обнаруживается, что в 4 местах используется один и тот же алгоритм, для чего как раз надо понимать, что это за алгоритм: извилины должны быть натренированы. Если он уже реализован в какой-то библиотеке, применим к текущему коду, она не будет лишней +1 зависимостью, то можно заменить на использование соответствующей библиотеки, если оно также даст положительный эффект. В противном случае можно абстрагировать алгоритм, т.е. провести дедупликацию.
- Во время написания кода реализация незаметно стремится к классическому алгоритму. Этому могут быть разные причины: недоразвитая архитектура, спешка, слабое владение предметной областью. Если этого не учесть, качество кода снизится, а также однажды может наступить предыдущий пункт.

Степень же владения — это удел человека. Можно вечно вести спор о том, нужны ли определенные знания программисту, но факт в том, что знания никогда не бывают лишними. "Лишними" они могут быть у тех, кто их попросту не собирается применять. Кто-то думает, что одного высшего образования достаточно? — существует Московский центр непрерывного математического образования (МЦНМО), явно показывающий, что математики много не бывает.

Знания бесконечны, а, следо
  7  Странник, 23 января 2020 г. 23:53:45
      Изучив несколько решений олимпиадных задач, я пришел к выводу что умение реализовать классический алгоритм (или структуру данных) с нуля не важно, гораздо важнее знать как их импортировать. Верно ли такое заключение? Будет ли оно верным для работы программистом (например, в яндексе)? Если нет, то в какой степени нужно владеть этим умением?
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru