Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Tl. Инициализация

Т2. Следующее отношение

Больше нет

ТЗ. Запись отношения

Т4. Поиск нулей

Т5. Вывод начала очереди

Пусто

Т8, Конец процесса


Т6. Удаление отношений

Больше нет

Т7. Удаление из очереди

Рис. 9. Топологическая сортировка.

BUFFER

ORIG ♦+100

Буферная область.

CON -1

Метка конца буфера.

<к ФАЗА ВВОДА

TOPSORT

IN BUFFER(TAPEIN)

Tl. Инициализация. Считать первый

JBUS ♦(TAPEIN)

блок ленты; дождаться завершения.

LD6 BUFFER+1

N-f-n.

ENT4 0,6

STZ X,4

Установить COUNT [fc] •(-Он TOP[fc] •(- Л

DEC4 1

n + l

для 0 < fc < п.

J4NN *-2

(Учесть, что QLINK [0] 0 на шаге Т4.)

ENT2 X,6

Свободная область начинается после X [п].

ENT5 BUFFER+2

Приготовиться к чтению первой пары {j, fc).

LD3 0,5

m + b

Т2. Следующее отношение.

J3P 3F

m + b

Верно ли, что j > 0?

J3Z 4F

Входной поток исчерпан?

IN BUFFER(TAPEIN)

Метка конца замечена; считать другой

JBUS ♦(TAPEIN)

блок с ленты, дождаться завершения.

ENT5 BUFFER

Переустановить указатель буфера.

JMP 2B

LD4 1,5

ТЗ. Запись отношения.

LDA X,4(COUNT)

COUNT[fc]

INCA 1

STA X,4(COUNT)

COUNT [fc].

INC2 1

AVAILS-AVAIL+ 1.

LDA Х.З(ТОР)

TOP[j]

STA 0,2(NEXT)

NEXT(P).

ST4 0,2(SUC)

fc -V SUC(P).

ST2 Х.З(ТОР)

P -V TOP [ j] .

INC5 2

Увеличить указатель буфера.

JMP 2B



0(TAPEIN)

Перемотать ленту ввода.

ENT4

Т4. Поиск нулей, к п.

ENT5

-100

Переустановить указатель буфера вывода.

ENT3

X,4(COUNT)

Проверить значение COUNT [fc].

♦+3

Не равно ли оно нулю?

X,3(QLINK)

QLINK [R] (- fc.

ENT3

Ki-k.

DEC4

n > fc > 1.

ФАЗА СОРТИРОВКИ

X(QLINK)

F.(- QLINK CO].

JBUS

♦(TAPEOUT)

T5. Вывод начала очереди.

BUFFER+100,5

Сохргшить F в области буфера.

n + l

Не равно ли нулю значение F?

INC5

Увеличить указатель буфера.

♦+3

Проверить, заполнен ли буфер.

BUFFER(TAPEOUT)

c- 1

Если дополнен, переписать блок на ленту.

ENT5

-100

Переустановить указатель буфера.

DEC6

N<-N- 1.

X.KTOP)

PTOPCF].

Тб. Удешение отношений.

0,2(SUC)

г14 (- SUC(P).

X.4(COUNT)

COUNT [rI4]

DECA

X, 4(COUNT)

-V COUNT [г14].

♦+3

Достигнут ли нуль?

X,3(QLINK)

n - a

Если достигнут, установить QLINK [R] <- rI4.

ENT3

n - a

R <- rI4.

0,2(NEXT)

P <- NEXT(P).

Если P # Л, повторить.

X,l(QLINK)

Т7. Удешение из очереди.

F <- QLINK(F), перейти к шагу Т5.

BUFFER(TAPEOUT)

ТВ. Конец процесса.

0(TAPEOUT)

Вывести последний блок и перемотать ленту.

Останов с выводом значения N на консоль.

TOPSORT

Начало области таблицы.

Анализ алгоритма Т достаточно просто можно выполнить с помощью закона Кирхгофа. Используя этот закон, время выполнения можно приблизительно оценить с помощью формулы Cim + C2n, где т - количество введенных отношений, п - количество объектов, а ci и сз-константы. Более быстрый алгоритм для решения этой задачи просто невозможно себе представить! Что касается программы Т, то для нее можно получить точную оценку времени выполнения, используя следующие параметры: о = количество объектов, не имеющих предшественника, b = количество блоков на входе, = \{тп -Ь 2)/50], и с = количество блоков на выходе = \{п + 1)/100]. Если не принимать во внимание продолжительность операций ввода-вывода, общее время выполнения в таком случае будет равно всего лишь (32тЧ-24п--7Ы-2с-- 16)и.

Метод топологической сортировки, аналогичный алгоритму Т (но без важной особенности связанных списков), впервые был опубликован А. Б. Каном (А. В. Kahn,



САСМ 5 (1962), 558-562), а доказательство того, что топологическая сортировка частичного упорядочения всегда возможна, было впервые опубликовано Э. Шпильрай-ном (Е. Szpilrajn, Fanjdamenta Mathematica 16 (1930), 386-389). Он доказал этот результат как для бесконечных, так и для конечных множеств, причем упомянул, что он уже был известен некоторым из его коллег.

Несмотря на столь высокую эффективность алгоритма Т в разделе 7.4.1 будет рассмотрен еще более эффективный алгоритм топологической сортировки.

УПРАЖНЕНИЯ

► 1. [10] в операции (9) для "выталкивания" элемента из стека предусмотрена возможность обработки события недостатка (UNDERFLOW). Почему тогда в операции (8) для "проталкивания" элемента в стек не предусмотрена возможность обработки события переполнения (OVERFLOW)?

2. [22] Напишите подпрограмму "общего назначения" для компьютера MIX, которая выполняла бы операцию вставки (10). Эта подпрограмма должна удовлетворять следующим требованиям (так же, как и в разделе 1.4.1).

Условия вызова: JMP INSERT Переход к подпрограмме.

NOP Т Адрес указательной переменной.

Условия ввода: гА = информация, которая должна быть введена в поле INFO нового

узла.

Условия вывода: Стек, указатель которого является переменной связи Т и имеет сверху новый узел; гП := Т; г12, г13 изменяются.

3. [22] Напишите подпрограмму "общего назначения" для компьютера MIX, которая выполняла бы операцию удаления (11). Эта подпрограмма должна удовлетворять следующим требованиям.

Условия вызова: JMP DELETE Переход к подпрограмме,

NOP Т Адрес указательной переменной.

JMP UNDERFLOW Первый выход, если происходит событие UNDERFLOW.

Условия ввода: Не определены.

Условия вывода: Если стек, указателем которого является переменная связи Т, пуст, срабатывает первый выход, в противном случае удаляется верхний узел стека и выход переносится к третьей позиции после JMP DELETE. В последнем случае г11 = Т и в гА находится содержимое поля INFO удаленного узла. В любом случае г12 и г13 используются этой подпрограммой.

4. [22] Программа (10) основана на операции Р -J= AVAIL, определенной действиями (6). Покажите, как можно создать такую подпрограмму обработки событий переполнения (OVERFLOW), чтобы без каких-либо изменений в коде (10) в операции Р AVAIL использовалось ограничение SEQMIN, указанное в (7). В общем случае эта подпрограмма не должна изменять содержимое регистров, за исключением регистра rJ и, возможно, индикатора сравнения. Она должна иметь выход в позиции rJ - 2 вместо обычной позиции rJ.

* 5. [24] Операции (14) и (17) эквивалентны операциям с очередью. Покажите, как можно было бы определить операцию "вставка элемента с начала очереди" для получения набора всех действий, выполняемых для дека с ограниченным вводом. Как в таком случае определить операцию "удаление с конца" (для получения дека общего типа)?

6. [21] В операции (14) было установлено LINK(P) ч- Л, тогда как следующая операция вставки элемента в конце очереди изменит значение того же самого поля связи. Покажите, как можно было бы избежать установки LINK(P) в (14) при внесении изменений в проверку условия F = Л в (17).



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 [ 98 ] 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225