Модель вычислений

В прошлом разделе мы говорили о том, что время работы алгоритма зависит от размера входных данных, ввели $O$-нотацию. Однако, чтобы формализовать это понятие, нам нужно ввести модель вычислений. Модель вычислений определяет набор операций, который мы можем выполнять за константное время.

Интуиция

Интуитивно мы будем ожидать от модели следующих свойств:

  • Ввод-вывод данных занимает константное время
  • Арифметические операции выполняются за константное время
  • Обращение к произвольному элементу массива выполняется за константное время

RAM-модель

  • RAM-модель может совершать арифметические и битовые операции, операции присваивания с числами длины $O(C)$ за константное время. Здесь $C$ - некоторая заранее заданная константа.
  • RAM-модель может обращаться к произвольному элементу массива за константное время.
  • RAM-модель может совершать ветвления и циклы за константное время.
  • RAM-модель может выделять память под массив любой длины за константное время.

Проблемы RAM-модели

  • RAM-модель не учитывает кэши процессора, которые могут сильно влиять на время работы алгоритма.
  • RAM-модель не может учесть многоядерность процессора.
  • Процессоры обрабатывают разные операции за разное время, например деление дольше умножения, которое дольше сложения.
  • Современные процессоры поддерживают разные дополнительные инструкции, которые могут работать за 1 такт, однако в RAM-модели они считаются не константными, например операция подсчета количества бит в числе.

И хотя RAM-модель не учитывает все эти нюансы, она является удобным инструментом для оценки времени работы олимпиадных алгоритмов.