Как определить «жадный» алгоритм? - PullRequest
16 голосов
/ 25 октября 2011

Я читаю учебник о «жадных» алгоритмах, но мне трудно определить, как они решают реальные проблемы «Top Coder».

Если я знаю что данная проблема может быть решена с помощью «жадного» алгоритма, решение довольно легко закодировать.Однако, если мне не сказали, что эта проблема «жадная», я не смогу ее обнаружить.

Каковы общие свойства и закономерности проблем, решаемых с помощью «жадных» алгоритмов?Могу ли я свести их к одной из известных «жадных» проблем (например, MST)?

Ответы [ 3 ]

11 голосов
/ 25 октября 2011

Формально, вам, конечно, придется доказать свойство matroid.Однако я предполагаю, что с точки зрения верхнего кодера вы скорее хотите быстро выяснить, можно ли с жадностью подходить к проблеме.

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

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

  • Есть ли у меня выбор между различными альтернативами в какой-то момент?
  • Приводит ли этот выбор к подзадачам, которые могутбыть решенным индивидуально?
  • Смогу ли я использовать решение подзадачи для выработки решения для общей проблемы?

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

(Опять же, для справки, я предполагаю контекст верхнего кодера ... для чего-то более реалистичного и практического, я настоятельно советую фактически проверить структуру матроида перед выбором жадного алгоритма.)

5 голосов
/ 25 октября 2011

Часть вашей проблемы может быть вызвана мыслью о «жадных проблемах».Есть жадные алгоритмы и проблемы, где есть жадный алгоритм, который приводит к оптимальному решению.Существуют и другие сложные проблемы, которые также могут быть решены с помощью жадных алгоритмов, но результат не обязательно будет оптимальным.

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

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

Как правило, проблемы с оптимальными, жадными решениями в любом случае легки, а другие заставят вас придумать жадного.эвристический, из-за ограничений сложности.Обычно значимое сокращение показывает, что ваша проблема на самом деле, по крайней мере, NP-сложна, и, следовательно, вы знаете, что вам придется найти эвристику.Для тех проблем, я большой поклонник попробовать.Реализуйте свой алгоритм и попытайтесь выяснить, являются ли решения «довольно хорошими» (идеально, если у вас также есть медленный, но правильный алгоритм, с которым можно сравнивать результаты, в противном случае вам может потребоваться создать основную правду, созданную вручную).Только если у вас есть что-то, что работает хорошо, постарайтесь подумать, почему, а может быть, даже попытаться придумать доказательство границ.Может быть, это работает, может быть, вы заметите пограничные случаи, когда это не работает и нуждается в уточнении.

1 голос
/ 06 декабря 2011

"Термин, используемый для описания семейства алгоритмов. Большинство алгоритмов пытаются достичь некоторой" хорошей "конфигурации из некоторой начальной конфигурации, делая только допустимые шаги. Часто есть некоторая мера" добротности "решения (предполагая, что один найденный). Жадный алгоритм всегда старается выполнить максимально возможный ход. Обратите внимание, что этот критерий является локальным: жадный алгоритм не «думает заранее», соглашаясь выполнить какое-то посредственное движение сейчас, что позволит лучше двигаться позже.

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

Основным преимуществом жадного алгоритма обычно является простота анализа. Обычно это также очень легко программировать. К сожалению, это часто неоптимально. --- Ариэльс (http://www.everything2.com/title/greedy+algorithm?searchy=search)

...