|
| Алгоритм A4-1. |
|
Примем следующую формулировку:
"вычислить по входным значениям пары натуральных
чисел соответствующее выходное значение - их произведение".
|
|
На ключевое слово "вычислить" обратите
внимание: его присутствие отражается в том, как построен
следующий алгоритм.
Вернувшись на сколько-то лет назад, каждый из
нас вспомнит, как его учили решать эту задачу в первом классе.
Предположим, в порядке обсуждения, что входной тест включает
числа 5 и 6 (очевидно, годится и любая другая пара однозначных
чисел).
Возьмем кучку из 5 спичек; добавим к ним еще
5 из второй кучки; затем еще пять из третьей; и так далее,
пока не соберем спички из всех 6 кучек вместе. Сколько всего у
нас получилось спичек? Возможно, для умножения 5´6 вам предлагали в детстве интерпретацию
"5 куч по 6 спичек", но автора учили именно так, - впрочем,
сути это не меняет.
|
Такое объяснение, или нечто в том же роде,
описывает алгоритм умножения двух сомножителей, - первого
на второй, - в классе натуральных чисел. Трудоемкость этого
алгоритма составляет O(n), где n - второй сомножитель.
| Алгоритм A4-2. |
|
Несколько больше проблем вызовет ситуация
большого числа кучек (пусть в новом примере их 26) и спичек в
них (по 15 в каждой). Теперь уместно вспомнить алгоритм
умножения "в столбик".
Умножая здесь 6 на 15, по ходу вычислений мы
должны умножить 6 на 5 (или 5 на 6), что позволяет свести
многие шаги алгоритма A4-2 к вызовам алгоритма
A4-1. Можно предположить, что в свое время этот вариант
алгоритма был одним из первых опытов читателя в применении
метода сведения задачи к подзадачам.
|
| Алгоритм A4-3. |
|
Чем нас не устраивает, - или может не
устроить, при наличии лучшего решения, - алгоритм
A4-2? Естественно, многократными вызовами алгоритма
A4-1, чья эффективность сомнительна. Здесь-то, наконец,
нам и пригодится таблица умножения.
Значение, которое постановка задачи
предлагает вычислить, таблицей предоставляется непосредственно
- на пересечении 5-й строки и 6-го столбца. Все бы хорошо, но
остальные строки и столбцы оказываются "лишними", создавая
проблему выбора именно той пары, которая нужна. Так возникают
две однотипные подзадачи (вновь: декомпозиция!) - поиска 5-й,
сверху, строки и, после этого, поиска в ней 6-го, слева,
числа.
|
Такой поиск отнюдь не является примитивной
операцией. Он требует циклической обработки кандидатов в
определенной последовательности, - в нашем случае, перебор и
проверку строк с 1-й по 5-ю, затем столбцов с 1-го по 6-й. Легко
заметить, что очередность кандидатов в последовательности может быть
установлена и иначе: скажем, от нижней строки - вверх и, затем, от
правого крайнего столбца - влево. Но характер этих отличий лишь
технический, они никак не влияют на оценку трудоемкости перебора
входящих в последовательность элементов.
Нас же, разумеется, интересует алгоритмическое
отличие. Принципиально иначе работает метод "разделяй и
властвуй", хотя здесь мы его только упомянем, оставляя
обсуждение механизма на будущее.
Таким образом, в нашей классификации надо
предусмотреть место не единственному в своем роде механизму -
последовательному поиску, а целому семейству алгоритмов
поиска, в котором, кстати, есть и другие представители помимо
двух уже упомянутых. Вот и технология поиска в таблице, - в
данном случае, - разбивается на две самостоятельных подзадачи
поиска в линейном массиве.
Вернемся еще раз к исходной постановке задачи.
Оказывается, мы ее "незаметно" подменили, - как только появилась
таблица. Фактически, модификация формулировки связана с замещением
ключевого слова "вычислить" словом "найти". То
есть, соответствующая постановка задачи, как только ее дополнили
подходящей структурой данных, сразу подсказала нам иное
алгоритмическое решение. О структурах данных мы поговорим ниже, а
пока попробуем развить это соображение дальше.
Назад
|