книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdfВыполняется третий перенос: xz , zy .
Возвращаемся к 3:
|
|
x |
|
|
|
|
z |
|
|
|
y |
|
|
|
|
||
|
3, |
|
|
, |
|
|
|
, |
|
|
|
|
; |
|
|||
x |
|
z |
|
y |
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x , |
y , |
z ; |
|
|
|||||||||||
2, |
|
|
|||||||||||||||
|
|
x |
|
|
|
|
y |
|
|
|
z |
|
|
|
(2.47) |
||
|
|
|
|
|
|
|
|
|
|
|
. |
||||||
|
|
|
x |
, |
|
z |
|
; |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
x |
|
z |
|
|
|
|
|
||||||||
|
|
y |
|
|
|
|
z |
|
|
|
x |
|
|
|
|||
|
2, |
, |
|
, |
; |
|
|
||||||||||
|
|
|
|
|
|||||||||||||
|
|
y |
|
|
|
|
|
z |
|
|
|
x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выполняется четвёртый перенос xx , zz . Большой диск пе-
ренесён! Больше, чем полдела, – сделано!
Теперь «перелом» 2, yy , zz , xx :
|
|
|
x |
|
|
|
|
z |
|
|
|
y |
|
|
|
x |
|
|
z |
|
|
|
|
|
y |
|
|
|
|||||||||
|
2, |
|
|
|
|
, |
|
|
|
|
|
, |
|
|
|
|
; |
1, |
|
|
, |
|
|
|
, |
|
|
|
|
; |
|
||||||
y |
z |
|
x |
y |
x |
|
|
z |
|
||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
x |
|
|
|
|
y |
|
|
|
z |
|
|
|
|
x |
|
|
|
y |
|
|
|
|
|
z |
|
|
|
|||||||
1, |
|
|
|
|
, |
|
|
|
|
|
|
, |
|
|
|
; |
|
0, |
|
|
|
, |
|
|
|
|
, |
|
|
; |
|
|
|||||
|
y |
|
|
x |
|
z |
y |
|
|
z |
|
x |
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(2.48) |
|||||||||||||
|
|
|
|
x |
|
|
|
|
z |
|
|
|
|
|
|
|
|
|
x |
|
|
|
z |
|
|
|
|
|
|
. |
|||||||
|
|
|
|
, |
|
; |
|
|
|
|
|
|
|
, |
|
|
; |
|
|
|
|
||||||||||||||||
|
|
|
|
y |
|
z |
|
|
|
|
|
|
|
y |
|
x |
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
y |
|
|
|
|
|
z |
|
|
|
|
x |
|
|
|
|
|
y |
|
|
|
z |
|
|
|
|
|
x |
|
|
|
||||
|
1, |
|
, |
|
|
, |
|
; |
|
|
0, |
|
, |
|
|
, |
|
|
; |
|
|
||||||||||||||||
|
|
x |
|
|
z |
|
y |
|
|
z |
|
|
x |
|
|
|
y |
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Получаем пятый перенос: xy , xz .
51
Возвращаемся:
|
|
|
x |
|
|
|
|
z |
|
|
|
|
y |
|
||||||
|
2, |
|
|
|
|
, |
|
|
|
|
|
, |
|
|
|
|
|
; |
||
y |
z |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
x |
|
||||||||
|
|
|
x |
|
|
|
|
y |
|
|
|
|
z |
|
|
|||||
1, |
|
|
|
|
, |
|
|
|
|
|
|
, |
|
|
|
|
; |
|
||
|
|
|
y |
|
|
|
|
x |
|
|
|
|
z |
|
|
|||||
|
|
|
|
x |
|
|
|
|
z |
|
|
|
|
|
|
. |
||||
|
|
|
|
, |
|
; |
|
|
|
|
||||||||||
|
|
|
|
y |
|
z |
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
y |
|
|
|
|
|
z |
|
|
|
|
|
x |
|
|
|
||
|
1, |
|
, |
|
|
, |
|
|
; |
|
||||||||||
|
|
x |
|
|
z |
|
|
y |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Получаем шестой перенос: xy , zz .
И, наконец, последний «перелом» 1, xy , zz , xy :
|
x |
|
z |
|
|
y |
|
|
|
|
1, |
|
, |
|
|
, |
|
|
|
|
; |
x |
z |
|
y |
|||||||
|
|
|
|
|
|
|
||||
|
x |
|
y |
|
|
z |
|
|
|
|
0, |
|
, |
|
|
, |
|
|
; |
|
|
x |
y |
z |
|
|||||||
|
|
|
|
|
|
|
||||
|
x |
z |
|
|
|
. |
||||
|
|
|
|
|
x z
0, y , z , x ;
y z x, ;
(2.49)
(2.50)
Получаем седьмой и последний перенос xx , zz . Дерево ре-
шения для n = 3 изображено на рис. 2.24.
52
Рис. 2.24. Дерево решения для n =3
В заключение приведём интерактивную Ханойскую башню из музея университета Мехико (рис. 2.25).
Интересной также представляется цветовая «визуализация» перестановок трёх переменных, используемых в рекурсивном алгоритме (рис. 2.26).
Рис.2.25.Ханойская башня |
Рис.2.26.Цветовое |
вмузееуниверситетаМехико |
представлениевозможных |
|
перестановок трёх |
|
переменных |
|
53 |
2.3.ОЦЕНКА СЛОЖНОСТИ РЕКУРСИВНОГО АЛГОРИТМА РЕШЕНИЯ ЗАДАЧИ О ХАНОЙСКОЙ БАШНЕ
Таким образом, обозначая сложность переноса одного диска ONEDISC (x, z) как h, получаем [2]:
T (n) 2 T (n 1) 2 h 1, |
(2.51) |
|
T (0) 1 0. |
||
|
Здесь +2 – это два раза операция вычитания (n–1), а +1 – это операция сравнения (if n > 0). Итак,
T (n) 2 T (n 1) h 3, |
(2.52) |
|
T (n) 1. |
||
|
Ясно, что каждый раз происходит удвоение сложности задачи:
T (n) v 2n w,x |
1;x 6, |
(2.53) |
|
|
0 |
1 |
|
где v, w – коэффициенты, подлежащие определению. Тогда
v 2n w 2(v 2n 1 w) h 3;v w 1.
Решаем:
w 1 v,
v 2n 1 v 2(v 2n 1 1 v) h 3, v 2n 1 v v 2n 2 2 v h 3, 1 v 2 2 v h 3,
v h 4,
w 1 h 4 (h 3).
Таким образом:
T (n) (h 4) 2n (h 3).
Это экспоненциальная функция сложности.
(2.54)
(2.55)
(2.56)
54
3. ПОНЯТИЕ ОБ ОЦЕНКЕ СЛОЖНОСТИ ПРОГРАММ ВСТРОЕННЫХ СИСТЕМ
Вышеприведённые оценки сложности алгоритмов проводились в основном асимптотически в условных единицах, исходя из операторов языка высокого уровня. Для более точной оценки необходимо анализировать реальные машинные коды исполнителя-процессора, контроллера или микроконтроллера.
Сначала все программы для ЭВМ писались на языке машинных кодов, буквально ноликами и единичками, что было крайне неудобно и вызывало множество ошибок. Потом стали использовать восьмеричные, а затем и шестнадцатеричные коды, что было гораздо удобнее, но все равно сложно.
Потом догадались использовать буквенные аббревиатуры, например, MOV – от слова двигать (move), для обозначения команды пересылки информации, ADD – для обозначения сложения (addition) и пр. С использованием так называемого мнемокода (автокода) было труднее допустить ошибку в коде операции.
В начале эры ЭВМ, когда создавались отечественные ЭВМ, например, БЭСМ (большая, или быстродействующая электронносчётная машина) Институтом точной механики и вычислительной техники АН СССР (ИТМ и ВТ), М1 («Автоматическая цифровая вычислительная машина», малая ЭВМ) использовались и наши русские аббревиатуры… Называлось – Автокод.
Например:
011 И Логическое И СМ и слова по Аисп
012 НТЖ Исключающее ИЛИ (нетождественность)
СМ-сумматор, Аисп – исполнительный адрес. Пример «цифровой программы» для ЭВМ М-1 изображён на рис. 3.1.
55
На М1, кстати, решались и задачи ядерных исследований в институте И.В. Курчатова.
Перевод из буквенно-цифровых программ в машинные стали производить автоматически и возложили на специальные программы-компи- ляторы. Ну, а уже потом, с середины 50-х годов ХХ века, стали развиваться и языки высокого уровня.
Ассе́мблер (от англ. assembler – сборщик) – транслятор исходного текста программы, написанной на
языке Ассемблер как языке низкого уровня, в программу на машинном языке. Ассемблеры, как правило, создаются «под» конкретную архитектуру, операционную систему, но есть и примеры ограниченно-универсальных ассемблеров. Рассмотрим один из классических «интеловских» ассемблеров.
3.1.ПРИМЕРЫ КОМАНД ЯЗЫКА АССЕМБЛЕР:АSM51
Поскольку современные процессоры имеют сложную архитектуру, несколько так называемых ядер, несколько ступеней конвейера, кэши и пр., поэтому обратимся к более простым инструкциям классического микроконтроллера фирмы «Интел 8051» (МКС 51) [11], которые, как и сами принципы архитектуры 8051, до сих пор используются в различных микроконтроллерах общего и специального назначения и позволяют получить общее представление об ассемблере.
Система команд этого микроконтроллера включает следующие группы команд (инструкций):
–передачи данных;
–арифметических операций;
56
–логических операций;
–передачи управления;
–операций с битами.
Вдокументации («мануале») можно найти информацию
околичестве байт в команде и о числе циклов её выполнения (это не циклы в смысле циклических структур в алгоритме, это так называемые машинные циклы), необходимых для выполнения команды (в случае конвейеризации потока команд с числом машинных циклов все гораздо сложнее).
Большинство команд из 111 (94) содержат один или два байта и выполняются за один или два машинных цикла. При тактовой частоте, например, 12 МГц длительность машинного цикла (12 тактов) составляет 1 мкс.
Пример команд (инструкций) из группы команд передачи данных приведен в табл. 3.1.
Таблица 3.1
Пример команд из группы команд передачи данных
|
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
1. |
Пересылкавакку- |
MOVA,Rn |
11.101.rrr |
1 |
1 |
(A)←(Rn) |
муляторизрегистра |
|
|
|
|
|
|
n =0…7 |
|
|
|
|
|
|
2. Пересылка в акку- |
MOVA,ad |
11.100.101 |
2 |
1 |
(A)←(ad) |
|
мулятор прямо- |
|
xx.xxx.xxx |
|
|
|
|
адресуемого байта |
|
|
|
|
|
|
3. Пересылка в акку- |
MOVA,@Ri |
11.100.11i |
1 |
1 |
(A)←((Ri)) |
|
мулятор байта из |
|
|
|
|
|
|
РПД i = 0,1 |
|
|
|
|
|
|
4. |
Загрузкаваккуму- |
MOVA,#d |
01.110.100 |
2 |
1 |
(A)←#d |
ляторконстанты |
|
xx.xxx.xxx |
|
|
|
|
5. |
Загрузкавстек |
PUSHad |
11.000.000 |
2 |
2 |
(SP)←(SP)+1 |
|
|
|
xx.xxx.xxx |
|
|
((SP))←(ad) |
6. |
Извлечениеизстека |
PОРad |
11.010.000 |
2 |
2 |
(ad)←(SP) |
|
|
|
xx.xxx.xxx |
|
|
(SP)←(SP)–1 |
Таким образом, например, загрузка в регистр-аккумулятор (обозначается А) константы, например, 1 (десятичный код) бу-
57
дет символически записана как MOV A, #1. # – обозначение так называемого непосредственного, то есть идущего за байтом команды, операнда-константы.
В двоичном коде получим два байта, перечислим их через запятую 01.110.100, 00.000.001. В восьмеричном коде получим: 164Q, 001Q, где Q – символ восьмеричного кода (символ О, от «octal» или о, ну очень неудобен, так как жутко похож на ноль). В шестнадцатеричном: 74Н, 01Н, где Н – символ шестнадцатеричного кода. Интересна команда записи информации в стек – PUSH, извлечения из стека – POP. Пример команд из группы команд арифметических операций приведен в табл. 3.2.
Таблица 3.2
Пример команд из группы команд арифметических операций
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
1. Сложение аккуму- |
ADDA,Rn |
00.101.rrr |
1 |
1 |
(A)←(A)+(Rn) |
лятора с регистром n |
|
|
|
|
|
= 0…7 |
|
|
|
|
|
2.Сложениеаккуму- |
ADDA,ad |
00.100.101 |
2 |
1 |
(A)←(A)+(ad) |
лятораспрямоадре- |
|
xx.xxx.xxx |
|
|
|
суемымбайтом |
|
|
|
|
|
3.Сложение аккуму- |
ADDA,@Ri |
00.100.11i |
1 |
1 |
(A)←(A)+((Ri)) |
лятора с байтом из |
|
|
|
|
|
РПД i = 0,1 |
|
|
|
|
|
4. Сложение аккуму- |
ADDA,#d |
00.100.100 |
2 |
1 |
(A)←(A)+#d |
лятора с константой |
|
xx.xxx.xxx |
|
|
|
В команде сложения ADD A, Rn (00.101.rrr) код зависит от номера регистра rrr. Поскольку аккумулятор имеет номер 7, то можно получить команду сложения аккумулятора с аккумулятором: ADD A, А (00.101.111). Но для этого в аккумулятор надо что-то загрузить, например MOV A, #1. Вычитание обозначается SUBB, инкремент – INC, декремент – DEC, есть умножение – MUL, деление DIV, они длятся аж 4 машинных цикла. Пример команд из группы команд логических операций приведен в табл. 3.3.
58
Таблица 3.3
Пример команд из группы команд логических операций
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
1. Логическое И |
ANLA,Rn |
01.011.rrr |
1 |
1 |
(A)←(A)&(Rn) |
аккумулятора и |
|
|
|
|
|
регистра n = 0…7 |
|
|
|
|
(A)←(A)&(ad) |
2. Логическое И ак- |
ANLA,ad |
01.010.101 |
2 |
1 |
|
кумулятора и прямо- |
|
xx.xxx.xxx |
|
|
|
адресуемого байта |
|
|
|
|
(A)←(A)&((Ri)) |
3.ЛогическоеИ |
ANLA,@Ri |
01.010.11i |
1 |
1 |
|
аккумулятораибай- |
|
|
|
|
|
таизРПДi =0,1 |
|
|
|
|
(A)←(A)d |
4. Логическое И |
ANLA,#d |
01.010.100 |
2 |
1 |
|
аккумулятора |
|
xx.xxx.xxx |
|
|
|
и константы |
|
|
|
|
(ad)←(ad)&(А) |
5. Логическое И |
ANLad, A |
01.010.010 |
2 |
1 |
|
прямоадресуемого |
|
xx.xxx.xxx |
|
|
|
байта и аккумуля- |
|
|
|
|
|
тора |
|
|
|
|
(ad)←(ad)d |
6. Логическое И |
ANLad,#d |
01.010.011 |
3 |
2 |
|
прямоадресуемого |
|
xx.xxx.xxx |
|
|
|
байта и константы |
|
xx.xxx.xxx |
|
|
|
Логическое ИЛИ обозначается ОRL, исключающее ИЛИ – ХRL, сброс аккумулятора – СLR, сдвиг влево – RL, с учетом переноса (через перенос) – RLС, вправо – RR, RRС, есть даже обмен тетрад аккумулятора SWAP.
Пример команд из группы команд операций с битами приведен в табл. 3.4.
Таблица 3.4
Пример команд из группы команд операций с битами
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
1. Сброс переноса |
СLRС |
11.000.011 |
1 |
1 |
(С)←0 |
2. Сброс бита |
СLRbit |
11.000.010 |
2 |
1 |
(b)←0 |
|
|
xx.xxx.xxx |
|
|
(С)←1 |
3.Установкапереноса |
SETBС |
11.010.011 |
1 |
1 |
59
Окончание табл. 3.4
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
4. Установка бита |
SETBbit |
11.010.010 |
2 |
1 |
(b)←1 |
|
|
xx.xxx.xxx |
|
|
(С)←not(С) |
5.Инверсияпереноса |
СРLС |
10.110.010 |
1 |
1 |
|
6. Инверсия бита |
СРL bit |
10.110.010 |
2 |
1 |
(b)←not(b) |
7.ЛогическоеИбитаи |
ANLС,bit |
10.000.010 |
2 |
2 |
(С)←(С)&(b) |
переноса |
|
xx.xxx.xxx |
|
|
(С)←(С)& |
8.ЛогическоеИинвер- |
ANLС,/bit |
10.110.000 |
2 |
2 |
|
сиибитаипереноса |
|
xx.xxx.xxx |
|
|
NOT(b) |
9.ЛогическоеИЛИбита |
ORLС,bit |
01.110.000 |
2 |
2 |
(С)←(С)v(b) |
ипереноса |
|
xx.xxx.xxx |
|
|
(С)←(С)v |
10. Логическое ИЛИ |
ORLС,/bit |
10.100.000 |
2 |
2 |
|
инверсии бита и пере- |
|
xx.xxx.xxx |
|
|
NOT(b) |
носа |
|
|
|
|
|
Группа команд передачи управления приведена в табл. 3.5.
Таблица 3.5
Группа команд передачи управления
Название |
Мнемокод |
КОП |
Байт |
Циклов |
Операция |
1. Длинный |
LJMPad16 |
00.000.010 |
3 |
2 |
(РС)←(ad16) |
переход в полном |
|
xx.xxx.xxx |
|
|
|
объеме памяти |
|
xx.xxx.xxx |
|
|
|
программ |
|
|
|
|
|
2. Абсолютный пе- |
АJMPad11 |
а10а9.а800.001 |
2 |
2 |
(РС)←(РС)+2 |
реход внутри стра- |
|
а7а6.а5а4а3.а2а1а0 |
|
|
(РС0–10)←ad11 |
ницы в 2 Кбайта |
|
|
|
|
|
3.Короткийотно- |
SJMPrel |
10.000.000 |
2 |
2 |
(РС)←(РС)+2 |
сительныйпереход |
|
xx.xxx.xxx |
|
|
(РС)←(РС)+rel |
внутристраницы |
|
|
|
|
|
в256байт |
|
|
|
|
|
4.Косвенныйотно- |
JMP@A+ |
01.110.011 |
1 |
2 |
(РС)←(А)+ |
сительныйпереход |
DPTR |
|
|
|
+DPTR |
5.Переход,если |
JZrel |
01.100.000 |
2 |
2 |
ЕслиА=0,то |
аккумуляторравен |
|
xx.xxx.xxx |
|
|
(РС)←(РС)+rel |
нулю |
|
|
|
|
иначе(РС)← |
|
|
|
|
|
(РС)+2 |
60