Подтвердить что ты не робот

Как развивать алгоритм интуиции?

Когда вы сталкиваетесь с проблемой в программном обеспечении, я обычно вижу решение сразу. Конечно, то, что я вижу, как правило, несколько не работает, и мне всегда нужно сидеть и проектировать (по общему признанию, я обычно не разрабатываю достаточно), но сразу получаю определенную интуицию.

Моя проблема: я не понимаю ту же интуицию, когда речь заходит о передовых алгоритмах. Я больше чувствую задачу создания еще одного Facebook, а затем строит еще один Google, или Проект Music Genom. Вероятно, потому, что я занимаюсь разработкой программного обеспечения довольно долгое время, но у меня мало опыта с составлением алгоритмов.

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

(Этот вопрос не имеет ничего общего с Алгоритмическая композиция. Ну, почти ничего)

4b9b3361

Ответ 1

+1 Для того, кто сказал, что опыт - лучший учитель.

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

  1. http://www.spoj.pl/
  2. http://uva.onlinejudge.org/
  3. http://www.topcoder.com/tc
  4. http://code.google.com/codejam/contests.html
  5. http://projecteuler.net/
  6. https://codeforces.com
  7. https://leetcode.com

Учебный сайт USACO - это учебная программа, которую проходят все участники компьютерной олимпиады в США. Он идет шаг за шагом, вводя все более и более сложные алгоритмы по мере продвижения.

Ответ 2

Возможно, вам будет полезно выполнять алгоритмы физически. Например, когда вы изучаете алгоритмы сортировки, практикуйте каждый с колодой карт. Это активирует разные части вашего мозга, чем чтение или программирование в одиночку.

Ответ 3

Стив Йегге назвал "Руководство по разработке алгоритмов" в one его тирадов. Я не видел его сам, но это звучит как просто билет из его описания.

Моим абсолютным фаворитом для такого рода подготовки к интервью является Стивен Скиена "Руководство по разработке алгоритмов". Больше, чем любая другая книга, это помогло мне понять, насколько удивительно обыденные (и важные) проблемы графа - они должны быть частью каждого рабочего инструментария программистов. Книга также охватывает основные структуры данных и алгоритмы сортировки, что является хорошим бонусом. Но золотой рудник является второй половиной книги, которая представляет собой своего рода энциклопедию 1-пейджеров на миллионы полезных проблем и различные способы их решения без особых деталей. Почти каждый 1-пейджер имеет простую картинку, что позволяет легко запомнить. Это отличный способ узнать, как идентифицировать сотни типов проблем.

Ответ 4

проблемная область

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

декомпозиция и отображение

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

модель

Моделируйте решение, по крайней мере, в своей голове, и пройдите через него, чтобы убедиться, что он работает правильно. При необходимости отрегулируйте (см. Разложение и сопоставление, выше).

Состав/интерфейсы

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

опыт

Опыт - лучший учитель, конечно, но чтение о различных проблемах и решениях также будет полезно. Изучение некоторых из известных алгоритмов и их приложений также очень полезно, например. Dijkstra, Bresenham, Unification и, конечно, теория графов.

Ответ 5

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

Ответ 6

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