Полный перебор: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м Bot: HTTP→HTTPS (v470)
Строка 20:
 
== Характерные задачи, решаемые методом полного перебора ==
Хотя полный перебор в большинстве прикладных задач (особенно не связанных со [[криптанализкриптоанализ|взломом шифров]]) на практике не применяется, есть ряд исключений. В частности, когда полный перебор всё же оказывается оптимальным, либо представляет собой ''начальный этап'' в разработке алгоритма, его использование оправдано. Примером оптимальности полного перебора является алгоритм оценки времени вычисления цепочечных произведений матриц, который не удаётся ускорить по сравнению с алгоритмом, основанным на методе «грубой силы»{{sfn|Cormen|2001|p=372}}. Этот алгоритм используется для решения классической задачи [[Динамическое программирование|динамического программирования]] — определения приоритетов вычислений матричных произведений следующего вида: <math>A_1 A_2 A_3 \cdots A_n</math>.
<!-- Информация для дальнейшей работы над статьей.
По Корману, brute force применим к следующим алгоритмам:
Строка 43:
: <math>{\color{Violet}(}{\color{BurntOrange}(}A_1 {\color{BrickRed}(}A_2 A_3{\color{BrickRed})}{\color{BurntOrange})} A_4{\color{Violet})},</math>
: <math>{\color{Violet}(}{\color{BurntOrange}(}{\color{BrickRed}(}A_1 A_2{\color{BrickRed})} A_3{\color{BurntOrange})} A_4{\color{Violet})}.</math>
Выбрав правильный порядок вычислений, можно добиться значительного ускорения вычислений. Чтобы убедиться в этом, рассмотрим простой пример цепочки из 3-х матриц. Положим, что их размеры равны соответственно <math>10 \times 100, 100 \times 5, 5 \times 50 </math>. Стандартный алгоритм перемножения двух матриц размерами <math>p \times q, q \times r</math> требует время вычисления, пропорциональное числу <math>pqr</math> (число вычисляемых скалярных произведений){{sfn|Cormen|2001|pp=370-372370—372|loc=Произведение матричных цепочек}}. Следовательно, вычисляя цепочку в порядке <math>((A_1 A_2) A_3)</math>, получаем <math>10 \cdot 100 \cdot 5 = 5000</math> скалярных произведений для вычисления <math>(A_1 A_2)</math>, плюс дополнительно <math>10 \cdot 5 \cdot 50 = 2500</math> скалярных произведений, чтобы вычислить второе матричное произведение. Общее число скалярных произведений: 7500. При ином выборе порядка вычислений получаем
<math>100 \cdot 5 \cdot 50 = 25000</math> плюс <math>10\cdot 100 \cdot 50 = 50000</math> скалярных произведений, то есть 75000 скалярных произведений{{sfn|Cormen|2001|pp=370-372370—372|loc=Произведение матричных цепочек}}.
 
Таким образом, решение данной задачи может существенно сократить временные затраты на вычисление матричной цепочки. Это решение может быть получено полным перебором: необходимо рассмотреть все возможные последовательности вычислений и выбрать из них ту, которая при вычислении цепочки занимает наименьшее число скалярных произведений. Однако надо учитывать, что этот алгоритм сам по себе требует экспоненциальное время вычисления{{sfn|Cormen|2001|p=372}}, так что для длинных матричных цепочек выигрыш от вычисления цепочки самым эффективным образом (оптимальная [[Стратегия (математика)|стратегия]]) может быть полностью потерян временем нахождения этой стратегии{{sfn|Cormen|2001|p=377}}.
Строка 51:
[[Файл:Quicksort-example.gif|350px|thumb|right|Алгоритм [[Быстрая сортировка|быстрой сортировки]] — основанный на [[Парадигма программирования|парадигме]] «разделяй и властвуй».]]
 
В [[Теория алгоритмов|теории алгоритмов]] известны несколько широко применимых общих концепций. Метод полного перебора является одной из них. Фактически, полным перебором ''возможно'' воспользоваться в тех случаях, когда мы имеем дело с дискретной детерминированной системой, состояния которой могут быть легко проанализированы{{sfn|Cormen|2001|pp=65-6765—67|loc=Раздел 4. Метод «разделяй и властвуй»}}.
 
Другим ярким примером фундаментальной концепции теории алгоритмов является принцип «[[Разделяй и властвуй (информатика)|разделяй и властвуй]]». Эта концепция применима, когда система поддается разделению на множество подсистем, структура которых аналогична структуре исходной системы{{sfn|Cormen|2001|p=65}}. В таких случаях подсистемы также поддаются разделению, либо являются тривиальными{{sfn|Cormen|2001|p=65}}. Для таких систем тривиальной является исходно поставленная задача. Таким образом, реализация концепции «разделяй и властвуй» имеет [[Рекурсия|рекурсивный]] характер.