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


17

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

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

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

(Этот вопрос не имеет ничего общего с Algorithmic composition. Ну, почти ничего)

8

+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/

The USACO training site является учебная программа, которая все США вычисляя Olympiad участники проходят. Это идет шаг за шагом, вводя все более сложные алгоритмы, когда вы идете.


7

Стив Yegge называют "The Algorithm Design Manual" в one его тирады. Я не видел его сам, но похоже, что это просто билет из его описания.

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

  0

+1 для справки по книге. Это выглядит довольно интересно. 21 фев. 092009-02-21 22:31:27


5

проблемной области

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

разложение и отображение

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

модель

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

композиция/интерфейсы

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

опыт

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


9

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


0

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


0

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