Как развивать алгоритм интуиции?
Когда вы сталкиваетесь с проблемой в программном обеспечении, я обычно вижу решение сразу. Конечно, то, что я вижу, как правило, несколько не работает, и мне всегда нужно сидеть и проектировать (по общему признанию, я обычно не разрабатываю достаточно), но сразу получаю определенную интуицию.
Моя проблема: я не понимаю ту же интуицию, когда речь заходит о передовых алгоритмах. Я больше чувствую задачу создания еще одного Facebook, а затем строит еще один Google, или Проект Music Genom. Вероятно, потому, что я занимаюсь разработкой программного обеспечения довольно долгое время, но у меня мало опыта с составлением алгоритмов.
Я бы хотел, чтобы советы сообщества о том, что читать и какие проекты лучше всего подходят для составления алгоритмов.
(Этот вопрос не имеет ничего общего с Алгоритмическая композиция. Ну, почти ничего)
Ответы
Ответ 1
+1 Для того, кто сказал, что опыт - лучший учитель.
Существует несколько онлайн-порталов, в которых есть множество программных проблем, на которые вы можете отправлять свои собственные решения и получать автоматическую индикацию прохождения/неудачи.
- http://www.spoj.pl/
- http://uva.onlinejudge.org/
- http://www.topcoder.com/tc
- http://code.google.com/codejam/contests.html
- http://projecteuler.net/
- https://codeforces.com
- https://leetcode.com
Учебный сайт USACO - это учебная программа, которую проходят все участники компьютерной олимпиады в США. Он идет шаг за шагом, вводя все более и более сложные алгоритмы по мере продвижения.
Ответ 2
Возможно, вам будет полезно выполнять алгоритмы физически. Например, когда вы изучаете алгоритмы сортировки, практикуйте каждый с колодой карт. Это активирует разные части вашего мозга, чем чтение или программирование в одиночку.
Ответ 3
Стив Йегге назвал "Руководство по разработке алгоритмов" в one его тирадов. Я не видел его сам, но это звучит как просто билет из его описания.
Моим абсолютным фаворитом для такого рода подготовки к интервью является Стивен Скиена "Руководство по разработке алгоритмов". Больше, чем любая другая книга, это помогло мне понять, насколько удивительно обыденные (и важные) проблемы графа - они должны быть частью каждого рабочего инструментария программистов. Книга также охватывает основные структуры данных и алгоритмы сортировки, что является хорошим бонусом. Но золотой рудник является второй половиной книги, которая представляет собой своего рода энциклопедию 1-пейджеров на миллионы полезных проблем и различные способы их решения без особых деталей. Почти каждый 1-пейджер имеет простую картинку, что позволяет легко запомнить. Это отличный способ узнать, как идентифицировать сотни типов проблем.
Ответ 4
проблемная область
Сначала вы должны понять проблемную область. Изящное решение неправильной проблемы не является хорошим и не является эффективным решением проблемы в большинстве случаев. Качество решения, другими словами, часто относительное. Простая задача планирования, которая имеет детерминированное решение, которое занимает десять минут для запуска, может быть прекрасной, если расписания выполняются раз в неделю один раз в неделю, но если графики меняются несколько раз в день, тогда может потребоваться решение генетического алгоритма, которое сходится через несколько секунд.
декомпозиция и отображение
Во-вторых, разложите задачу на подзадачи и известные/неизвестные элементы, соответствующие элементам решения. Иногда это очевидно, например. для подсчета виджетов вам нужен способ идентификации виджетов, увеличивающийся счетчик и способ хранения счета. Иногда это не так очевидно. Иногда вам приходится одновременно разлагать проблему, домен и возможные решения, а также попробовать несколько разных сопоставлений между ними, чтобы найти их, которые приводят к правильным результатам [это общий метод].
модель
Моделируйте решение, по крайней мере, в своей голове, и пройдите через него, чтобы убедиться, что он работает правильно. При необходимости отрегулируйте (см. Разложение и сопоставление, выше).
Состав/интерфейсы
Много раз вы можете найти элементы проблемы и элементы решения, которые сопоставляются друг с другом и дают полезные результаты. Эта структура и конструкция интерфейса обеспечивают ядро решения, а также уменьшают объем оставшейся проблемы. Итак, вы просто возвращаетесь к вершине с меньшей начальной проблемой и снова проходите через нее.
опыт
Опыт - лучший учитель, конечно, но чтение о различных проблемах и решениях также будет полезно. Изучение некоторых из известных алгоритмов и их приложений также очень полезно, например. Dijkstra, Bresenham, Unification и, конечно, теория графов.
Ответ 5
Я не уверен, что интуиция можно культивировать, но я думаю, что знаю, что вы просите. Чем больше проблем вы решаете, тем больше информации и опыта вы имеете в своем распоряжении для будущих проблем. Итак, я говорю просто практику. Практика программирования приложений реального мира, и у вас много проблем. Иногда решение головоломок может быть очень учебным.
Ответ 6
Я пытаюсь найти физические аналоги, когда я рассматриваю сложную проблему.