Как вырастить алгоритм интуиции? - PullRequest
18 голосов
/ 22 февраля 2009

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

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

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

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

Ответы [ 6 ]

9 голосов
/ 22 февраля 2009

+ 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 - это учебная программа, которую проходят все участники компьютерной олимпиады в США. Он идет шаг за шагом, вводя все более сложные алгоритмы по мере продвижения.

9 голосов
/ 22 февраля 2009

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

7 голосов
/ 22 февраля 2009

Стив Йегге сослался на «Руководство по разработке алгоритма» в одном своих рантов. Я сам этого не видел, но, похоже, это просто билет из его описания.

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

5 голосов
/ 22 февраля 2009

проблемный домен

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

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

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

модель

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

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

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

опыт

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

0 голосов
/ 22 февраля 2009

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

0 голосов
/ 22 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...