Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1801 / 486 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 12:

Абак, алгорифмы Маркова, равнодоступная адресная машина

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Равнодоступная адресная машина

Равнодоступная адресная машина (РАМ) — это числовая модель вычислительного устройства. Эта модель является наиболее близкой из рассмотренных к реальным вычислительным машинам и позволяет наиболее реалистично применять теоретические оценки сложности алгоритмов к реальным вычислениям.

Память машины состоит из регистров (ячеек). Каждый регистр имеет адрес и может содержать произвольное число. Регистр с номером 0 называется сумматором.

Программа — последовательность пронумерованных команд. Команда имеет вид

\eq*{
\langle \t{код операции}\rangle\langle \t{операнд}\rangle
}

Коды операций

\eq*{
{\rm Load}, {\rm Store}, {\rm Add}, {\rm Sub}, {\rm Mult},
{\rm Div}, {\rm Read}, {\rm Write}, {\rm Jump}, {\rm JgtZ},
{\rm Jzero}, {\rm Halt}.
}

Операнд может быть одного из трех видов

\eq*{
= i, i, \ast i,
}

где iнатуральное число.

Содержимое регистра с номером i обозначим через c(i). Значение v(a) операнда a определяется в зависимости от его вида следующим образом.

\eqa*{ & v(a)\t{ — число}\ i,\ \t{если}\ a\ \t{имеет вид} && = i,\\
& v(a)\t{ — число}\ c(i),\ \t{если}\ a\ \t{имеет вид} && i,\\ &
v(a)\t{ — число}\ c(c(i)),\ \t{если}\ a\ \t{имеет вид} && \ast i.
}

При оценке сложности алгоритмов используют в зависимости от обстоятельств разные веса команд. При работе с малыми числами и малым числом регистров реалистичным оказывается так называемый равномерный вес, при котором каждая команда требует единицу времени. При работе с большими числами и большим количеством регистров используется так называемый логарифмический вес команды, при котором время выполнения команды зависит как от значения операнда, так и от значения его адреса.

При определении веса команды используется функция L\colon Z \to Z, выражающая длину записи числа

\eq*{
L(i)=\left\{\begin{aligned} & \log(i)+1 && \t{при}\ i\ne 0, \\ & 1 &&
\t{при}\ i=0.
\end{aligned}
\right.
}

Основание логарифма при получении асимптотических оценок не имеет существенного значения.

Вес t(a) операнда a определяется в зависимости от его вида следующим образом:

\eqa*{ & t(a) = L(i),\ \t{если}\ a\ \t{имеет вид} &&  = i,\\ &  &
& \\ & t(a) = L(i) + c(i),\ \t{если}\ a\ \t{имеет вид} && i,\\ &  &&
\\ & t(a) = L(i) + L(c(i)) + L(c(c(i))),\ \t{если}\ a\ \t{имеет вид} &&
\ast i.
}

Таблица 12.1.
Команда Действие Логарифмический вес
{\rm Load}(a) c(0) := v(a) t(a)
{\rm Store}(i) c(i) := c(0) L(c(0)) + L(i)
{\rm Store}(\ast i) c(c(i)):=c(0) L(c(0)) + L(i) + L(c(i))
{\rm Add}(a) c(0) := c(0) + v(a) L(c(0)) + t(a)
{\rm Sub}(a) c(0) := c({0})-v(a) L(c(0)) + t(a)
{\rm Mult}(a) c(0) := c(0)\cdot v(a) L(c(0)) + t(a)
{\rm Div}(a) c(0) := c(0) \mathop{\rm div}\nolimits v(a) L(c(0)) + t(a)
{\rm Read}(i) c(i) := очередное число L(i) + L(c(i))
{\rm Read}(\ast i) c(c(i)):= очередное число L(i) \!+\!L(c(i)) \!+\! L(c(c(i)))
{\rm Write}(a) печать v(a) t(a)
{\rm Jump}(a) переход на команду с номером a 1
{\rm JgtZ}(a) переход на команду с номером a, если c(0)>0 L(c(0))
{\rm Jzero}(a) переход на команду с номером a, если c(0)=0 L(c(0))
{\rm Halt}(a) конец вычислений 1

Например, команда {\rm Add} \ast i имеет логарифмический вес

\eq*{
L(c(0)) + L(i) + L(c(i)) + L(c(c(i))).
}

Временная сложность программы определяется как сумма весов всех выполненных команд с учетом их многократного выполнения.

Емкостная сложность программы определяется как сумма по всем регистрам длин максимальных чисел, побывавших в этих регистрах.

Пример. Рассмотрим вычисление n^n:

\formula{
{\rm  Read}(r);\\
\t if\ r < 0\ \t then\ \t{write}(0)\ \t else\\
\{r_2:= r;\ r_3:= r_1-1;\ \t while\
r_3< 0\ \t do\
\{r_2:= r_2 \ast r;\ r_3:= r_3-1\};\ \t{write}\
(r_2)\}.
}

Этот псевдокод легко может быть заменен РАМ-программой, представленной в таблице 12.2.

Таблица 12.2.
1 {\rm Read}\,1
2 {\rm Load}\,1
3 {\rm JgtZ}\,6
4 {\rm Write} = 0
5 {\rm Jump}\,22
6 {\rm Load}\,1
7 {\rm Store}\,2
8 {\rm Load}\,1
9 {\rm Sub} = 1
10 {\rm Store}\,3
11 {\rm Load}\,3
12 {\rm JgtZ} = 14
13 {\rm Jump}\,21
14 {\rm Load}\,2
15 {\rm Mult}\,1
16 {\rm Store}\,2
17 {\rm Load}\,3
18 {\rm Sub} = 1
19 {\rm Store}\,3
20 {\rm Jump}\,11
21 {\rm Write}\,2
22 {\rm Halt}

Когда команда 15 выполняется i -й раз, сумматор содержит n^i, а r2 содержит n. Эта команда выполняется ({n}-1) раз. При равномерном весовом критерии суммарное время — O(n). При логарифмическом весовом критерии суммарное время равно \suml(L(n^i) + L(n)), где суммирование ведется по i =
1,2\dts n. Поскольку (L(n^i) + L(n))\sim(i + 1) \log (n), получаем

\eq*{
\suml(L(n^i)+L(n))= O(n^2 \log n).
}

Емкостная сложность программы при равномерном критерии равна O(1), при логарифмическом — O(n \log n).

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...