1.2. Формально об алгоритмах. Несложно о сложности 53
Первое, о чем следует договориться, — это выбор вычис-
лительной модели, в которой конструируются наши алгорит-
мы. Оказывается, что как раз этот вопрос не имеет слишком
принципиального значения для теории сложности вычислений,
и тот уровень строгости, на котором мы работали в разделе 1.1
(число выполненных операторов на языке Python), оказывает-
ся почти приемлемым. Главная причина такого легкомыслен-
ного отношения к выбору модели состоит в том, что существу-
ют весьма эффективные способы моделирования (или транс-
ляции программ в более привычных терминах) одних есте-
ственных вычислительных моделей с помощью других. При
этих моделированиях сохраняется класс эффективных алго-
ритмов и, как правило, алгоритмы более эффективные в одних
моделях оказываются более эффективными и в других.
Сначала рассмотрим модель, наиболее напоминающую со-
временный компьютер, программируемый непосредственно
в терминах инструкций процессора (или на языке Assembler):
random access machines (RAM)
10
, т. е. «машины с произволь-
ным доступом к памяти».
RAM-машину составляют следующие компоненты (рис. 1.7).
• Конечная входная read-only лента, на которую записыва-
ются входные данные.
• Полубесконечная
11
выходная write-only лента, куда запи-
сывается результат работы машины.
• Бесконечное число регистров r
0
, r
1
, r
2
, . . ., каждый из ко-
торых может хранить произвольное целое число (изна-
чально везде записаны нули). Регистр r
0
является выде-
ленным и называется «сумматором» — этот регистр ис-
10
В теории сложности вычислений под машинами традиционно пони-
мают single-purpose machines, т. е. машины, каждая из которых создана
для решения какой-либо одной фиксированной задачи. В привычных тер-
минах это скорее программы.
11
Ограниченная с одной стороны и неограниченная с другой.