2. Теоретические сведения
Для анализа алгоритмов и их сложностей
необходимо
точно
определить
модель
вычислительного устройства, используемого для
реализации алгоритмов и условиться, что
понимать под элементарным шагом вычисления.
Примерами вычислительных моделей могут
служить:
1) машина с произвольным доступом к памяти,
2) машина с произвольным доступом к памяти и
хранимой программой,
3) машина Тьюринга,
4) машина с языком высокого уровня.
3. Теоретические сведения
Модель машины с произвольным доступом к памяти
или равнодоступная адресная машина (RandomAccess Machine – RAM) – это модель обобщенной
однопроцессорной машины. В этой модели
команды
процессора
выполняются
последовательно. Набор команд:
- арифметические команды (сложение, вычитание,
умножение, деление, вычисление остатка деления,
приближение действительного числа ближайшим
меньшим или ближайшим большим целым),
- команды перемещения данных (загрузка, занесение
в память, копирование),
- управляющие команды (условное и безусловное
ветвление, вызов подпрограммы и возврат из нее).
Для выполнения каждой инструкции требуется
фиксированный промежуток времени.
4. Теоретические сведения
В модели RAM есть целочисленный тип данных и тип
чисел с плавающей точкой. Также предполагается,
что существует верхний предел размера слова
данных. При этом целые числа представлены
clog2n битами, где c ≥ 1.
Временная сложность в худшем случае (или просто
временная сложность) RAM-программы – это
функция f(n), равная наибольшей (по всем входам
размера n) из сумм времен, затраченных на
каждую
сработавшую
команду.
Временная
сложность в среднем – это среднее, взятое по
всем входам размера n, тех же самых сумм. Такие
же понятия определяются для оценки емкости
памяти RAM-программы.
5. Теоретические сведения
Чтобы точно определить временную и емкостную сложности, необходимо
указать время, необходимое для выполнения каждой RAM-команды, и
объем памяти, используемой каждым регистром (элементом хранения
данных). Имеются два весовых критерия для оценки сложностей RAMпрограмм.
При равномерном весовом критерии каждая RAM-команда затрачивает
одну единицу времени и каждый регистр использует одну единицу
памяти.
Второе определение принимает во внимание ограниченность размера
реальной ячейки памяти и называется логарифмическим весовым
критерием. Логарифмический весовой критерий основан на грубом
допущении, что цена выполнения команды (ее вес) пропорциональна
длине ее операндов. Пусть l(i) – логарифмическая функция на целых
числах, тогда, если i в команде представляет собой целое число
(непосредственный операнд), номер регистра с нужным значением или
номер регистра для косвенной адресации, то логарифмический вес
равен l(i), l(i) + l(c(i)) и l(i) + l(c(i)) + l(c(c(i))) соответственно. Здесь c(i) –
целое число, содержащееся в регистре i.
6. Теоретические сведения
Пример 1. Предположим, что имеется RAM-программа, в
которой используется команда ADD *i для сложения двух
чисел – первое число хранится в регистре-сумматоре
(регистр с номером 0), а второе определяется с помощью
косвенной адресации по значению в регистре i. Для
определения веса этой команды сначала необходимо
определить
трудоемкость
декодирования
операнда,
представленного адресом. Просмотр целого числа i
занимает время l(i). Затем, чтобы прочитать содержимое
c(i) регистра i и определить его местоположение,
понадобится
время
l(c(i)).
Наконец,
считывание
содержимого c(i) требует время l(c(c(i))). Так как команда
ADD *i прибавляет целое число c(c(i)) к целому числу c(0) в
сумматоре, то, ясно, что разумным весом, который следует
придать команде ADD *i, является l(c(0)) + l(i) + l(c(i)) +
l(c(c(i))).
7. Контрольные вопросы
1.
2.
3.
4.
Вычислительная модель.
Виды вычислительных моделей.
Вычислительная модель RAM.
Временная сложность RAM-программы в худшем
случае.
5. Временная сложность RAM-программы в среднем.
6. Емкостная сложность RAM-программы в худшем
случае.
7. Емкостная сложность RAM-программы в среднем.
8. Равномерный весовой критерий.
9. Логарифмический весовой критерий.
10. Логарифмическая емкостная сложность.
8. Указания по выполнению заданий
1.
2.
3.
4.
Получить задание
Определить временную и емкостную сложности
решения задачи при использовании равномерного и
логарифмического весовых критериев .
Подготовить отчет по выполнению задания. Отчет
должен включать задание и описание этапов
выполнения задания.
Ответить на вопросы по выполнению задания и
контрольные вопросы
9. Задания
Дана модель RAM, команды которой приведены в таблице. Составить
алгоритмы решения задач в данной модели.
1.
Найти значение функции f(0) = 0, f(n) = nn, n ≥ 1.
2.
Вычислить факториал n! целого числа n.
3.
Прочитать n положительных чисел, за которыми следует
концевой маркер 0, а затем напечатать их в порядке неубывания.
4.
Найти минимальный элемент целочисленной
последовательности, заканчивающейся 0.
5.
Ввести целые число a и n чисел. Найти номер числа в
последовательности, совпадающего с a.
6.
Упорядочить массив из n целых чисел по убыванию.
7.
Найти количество элементов целочисленной
последовательности, заканчивающейся 0, между минимальным и
максимальным элементами.
8.
Найти определитель матрицы третьего порядка.
9.
Определить самую длинную серию нулей в целочисленной
последовательности из n элементов.
10. Прочитать n положительных чисел, за которыми следует
концевой маркер 0, а затем напечатать их в обратном порядке.
10. №
Команда
Описание
1
LOAD a
c(0) ← v(a)
2
STORE i
STORE *i
c(i) ← c(0)
c(c(i)) ← c(0)
3
ADD a
c(0) ← c(0) + v(a)
4
SUB a
c(0) ← c(0) – v(a)
5
MULT a
c(0) ← c(0) × v(a)
6
DIV a
c(0) ← c(0) × v(a)
7
READ i
READ *i
8
WRITE a
c(i) ← очередной входной символ
с(c(i)) ← очередной входной символ
Печать v(a)
9
JUMP b
Счетчик команд устанавливается на команду с меткой b
10
JGTZ b
Если c(0) > 0, то счетчик команд устанавливается на команду с
меткой b, в противном случае – на следующую команду
11
JZERO b
Если c(0) = 0, то счетчик команд устанавливается на команду с
меткой b, в противном случае – на следующую команду
12
HALT
Останов
11. Задания
В таблице используются следующие обозначения:
1. x ← y – значение y заносится в регистр x;
2. операндами команды могут быть
=i – целое число i,
i – содержимое регистра с номером i, i ≥ 0,
*i – косвенная адресация: значением операнда является
содержимое регистра j, где j – целое число, находящееся в
регистре i, i ≥ 0; если j < 0, машина останавливается;
3. c(i) – содержимое регистра i;
4. c(0) – содержимое сумматора;
5. v(a) – значение операнда a:
v(=i) = i,
v(i) = c(i),
v(*i) = c(c(i)).