Анимация
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 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262

Таблица 2

СОРТИРОВКА МЕТОДОМ ПРОСТОГО ДВУХПУТЕВОГО слияния

503 I 087 I 512 i 061 908 170 897 275 653 426 154 509 612 \ 677 765 703

503 703 i 512 677 509 908 426 897 653 275 \ 170 154 612 061 \ 765 087

087 503 703 765 154 170 509 908 897 653 426 275 677 612 512 061

061 087 503 512 612 677 703 765 908 897 653 509 426 275 170 154

061 087 154 170 275 426 503 509 512 612 653 677 703 765 897 908

сливаемые серии имеют длину 2*, тем не менее никаких явных мер предосторожности на случай таких исключений предусматривать не приходится! (См. упр. 8.) Проверки ступенек вниз в прежнем алгоритме заменены посредством уменьшения переменных q и г и проверки равенства нулю. Благодаря этому время выполнения на машине MIX асимптотически приближается к llTVlgTV машинным циклам, что несколько лучше результата, которого удалось достичь в алгоритме N.

На практике имеет смысл комбинировать алгоритм S с методом простых вставок. Вместо первых четырех просмотров алгоритма S можно методом простых вставок рассортировать группы, скажем, из 16 элементов, исключив таким образом довольно расточительные вспомогательные операции, связанные со слиянием коротких массивов. Как и в случае быстрой сортировки, такое комбинирование методов не влияет на асимптотическое время работы, но дает, тем не менее, немалую выгоду.

Рассмотрим теперь алгоритмы N и S с точки зрения выбора структур данных. Почему необходима память для 27V, а не для N записей? Причина относительно проста: мы работаем с четырьмя списками переменного размера (два входных списка и два выходных списка в каждом просмотре); при этом для каждой пары последовательно распределенных списков используется стандартное понятие "совместный рост" обсуждавшееся в разделе 2.2.2. Но в любой момент времени половина памяти не используется, и после некоторого размышления становится ясно, что в действительности для наших четырех списков следовало бы воспользоваться связным распределением памяти. Если к каждой из N записей добавить поле связи, то все необходимое можно проделать, пользуясь алгоритмами слияния, которые выполняют простые манипуляции связями и совсем не перемещают сами записи. Добавление Л полей связи, как правило, выгоднее добавления пространства памяти еще для N записей; отказавшись от перемещения записей, можно сэкономить и время. Итак, рассмотрим следующий алгоритм.

Алгоритм L {Сортировка посредством слияния списков). Предполагается, что в записяхЛ!,..., Rn содержатся ключи Ki,..., и поля связи Li,..., Ьдг, в которых могут храниться числа от -{N + 1) до {N + 1). В начале и в конце массива имеются искусственные записи Lq и L+i с полями связи Ro и Ллг+х- Этот алгоритм сортировки списков устанавливает поля связи таким образом, что записи оказываются связанными в порядке возрастания. После завершения сортировки Lq указывает на запись с наименьшим ключом; при 1 < к < N связь Lk указывает на запись, следующую за Rk, или Lk - О, если R - запись с наибольшим ключом (см. формулы 5.2.1-(13)).



в процессе работы этого алгоритма записи Ro и Rn+i выполняют роли головных элементов двух линейных списков, подсписки которых в данный момент сливаются. Отрицательная связь означает конец подсписка, о котором известно, что он упорядочен; нулевая связь означает конец всего списка. Предполагается, что N >2.

Через "\Ls\ <- р" обозначена операция "Присвоить Ls значение р или -р, сохранив прежний знак Lg" Такая операция легко реализуется на компьютере MIX, но, к сожалению, не на большинстве других моделей компьютеров. Нетрудно изменить алгоритм, чтобы получить столь же эффективный метод для большинства других машин.

L1. [Подготовить два списка.] Установить Lo <- 1, L+i <~ 2, Li <--(г + 2) при

1 < г < ЛГ - 2 и Ln-i <~ Ln <~ 0. (Созданы два списка, содержащих записи RijRsjRb,... и R2, R4,Re, соответственно; отрицательные связи указывают, что каждый упорядоченный подсписок состоит всего лишь из одного элемента. Другой способ выполнения этого шага, если принять во внимание упорядоченность, которая могла присутствовать в исходных данных, рассмотрен в упр. 12.)

L2. [Начать новый просмотр.] Установить s 4-0, t <- N + 1, р <- Ls, q <- Lt- Если g = О, выполнение алгоритма завершается. (В процессе каждого просмотра р и q "пробегают" по спискам, которые подвергаются слиянию; s обычно указывает на последнюю обработанную запись текущего подсписка, at - на конец только что выведенного подсписка.)

L3. [Сравнение Кр: Kg.] Если Кр > Kg, перейти к шагу L6.

L4. [Продвинуть р.] Установить \Ls\ <~ р, s р, р <~ Lp. Если р > О, вернуться к шагу L3.

L5. [Завершить подсписок.] Установить La <- q, s <- t. Далее установить t <r- q и q <~ Lg один или более раз, пока не станет g < О, после чего перейти к шагу L8.

L6. [Продвинуть q.] (Шаги L6 и L7 двойственны шагам L4 и L5.) Установить jLgj q, S <~ q, q <- Lg. Если q> О, вернуться к шагу L3.

L7. [Завершить подсписок.] Установить La <- р, s <- t. Затем установить f •«- р и р <г- Lp один или более раз, пока не станет р <0.

L8. [Конец просмотра?] (К этому моменту р < О п q < О, так как оба указателя продвинулись до конца соответствующих подсписков.) Установить р <- -р,

q <--q. Если q = О, установить \Lg\ <- р, \Lt\ О и вернуться к шагу L2. В

противном случае вернуться к шагу L3.

Пример работы этого алгоритма приведен в табл. 3, в которой показаны связи к моменту выполнения шага L2. По окончании выполнения алгоритма можно, пользуясь методом из упр. 5.2-12, перекомпоновать в памяти записи Ri,...,Rn так, чтобы их ключи стали упорядоченными. Нужно отметить интересную аналогию между слиянием списков и сложением разреженных многочленов (см. алгоритм 2.2.4А).

Напишем теперь MIX-программу для алгоритма L, чтобы выяснить, столь ли выгодно оперировать списками с точки зрения скорости выполнения, как и с точки зрения расхода памяти?

Программа L (Сортировка посредством слияния списков). Для удобства предполагается, что записи занимают одно слово, причем Lj хранится в поле (0:2) и



Таблица 3

СОРТИРОВКА ПОСРЕДСТВОМ СЛИЯНИЯ СПИСКОВ

j 0

1 2 3 4 5

6 7

8 9 10 11 12 13 14

Kj -

503 087 512 061 908

170 897

275 653 426 154 509 612 677

Lj 1

-3 -4 -5 -6 -7

-8 -9

-10 -И -12 -13 -14 -15 -16

Lj 2

-6 1-8 3 -10

5 -11

7 -13 9 12 -16 14 0

l] 4

3 1-11 2 -13

8 5

7 0 12 10 9 14 16

Lj 4

3 6 7 2 0

8 5

1 14 12 10 13 9 16

Lj 4

12 11 13 2 0

8 5

10 14 1 6 3 9 16

Kj - ъ

поле (3 : 5) no адресу INPUT + j. Состояние регистров таково:

rI2 = q, rI3 = s, rI4 = t, гА = AT,;

TV > 2.

01 L

EQU 0:2

Определение имен полей.

02 ABSL

EQU 1:2

05 KEY

EQU 3:5

04 START

ENTl N-2

Ы. Подготовить два списка.

ENNA 2,1

STA INPUT,КL)

Li-{i + 2).

DECl 1

JIP *-3

N -2>i>0.

ENTA 1

STA INPUT(L)

Lo <r- 1.

ENTA 2

STA INPUT+N+1(L)

Ln+1 <- 2.

STZ INPUT+N-1(L)

Ln-1 <- 0.

STZ INPUT+N(L)

Ln <- 0.

JMP L2

Перейти к шагу L2.

16 L3Q

LDA INPUT,2

C" + B

L3. Сравнение Кр. К.

17 L3P

CMPA INPUT,1(KEY)

JL L6

Перейти к шагу L6, если Kq < Кр.

iP L4

STl INPUT,3(ABSL)

L4. Продвинуть р. L.,<-р.

ENT3 0,1

s <- р.

LDl INPUT,1(L)

p<-Lp.

JIP L3P

Перейти к шагу L3, если р > 0.

23 L5

ST2 INPUT,3(L)

L5. Завершить подсписок. <

ENT3 0,4

ENT4 0,2

t<-q.

LD2 INPUT,2(L)

qLq.

J2P *-2

Повторить, если g > 0.

JMP LB

Перейти к шагу L8.

29 L6

ST2 INPUT,3(ABSL)

С"

L6. Продвинуть Q. L.,-«-(7.

ENT3 0,2

С"

s q.

LD2 INPUT,2(L)

С"

q<-Lq.

J2P L3Q

С"

Перейти к шагу L3, если q > 0.

33 L7

STl INPUT,3(L)

в"

L7. Завершить подсписок. <-

ENT3 0,4

в"

s <- t.

ENT4 0,1

D"

t<- р.

LDl INPUT,1(L)

D"

pLp.

JIP *-2

D"

Повторить, если р > 0.

38 L8

ENNl 0,1

L8. Конец просмотра? р <--р.



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 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262