Анимация
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

устанавливается AVAIL 4- AVAIL-t-N. Для освобождения этих N слов просто устанавливается AVAIL <- AVAIL - N.

Аналогично для метода "первым выделен - первым освобожден" используются операции с циклической очередью.

2. Количество памяти, необходимой для хранения элемента длиной I, составляет к\1/{к - Ь)], среднее значение которого равно кЬ/{к - Ь) + (1 - а)к, где а предполагается равным 1/2, не зависящим от к. Это выражение минимально (для действительных значений к) при к = Ь+ \/2ЬЬ. Поэтому выбор к равным ближайшему (сверху или снизу) к этой величине целому значению дает наименьшее значение кЬ/(к - Ь) + к. Например, при b = 1 и L = 10 следует принять к х 1 + д/20 = 5 или 6; оба значения одинаково хороши. Более детально эта задача рассматривается в JACM 12 (1965), 53-70.

4. rll = Q, rI2 = P.

rA 4- N.

P 4- LOC(AVAIL). Q <- P.

P i- LINK(Q).

Если P = A, нет памяти.

Переход при N > SIZE (Р). rA<-N-SIZE(P) =К. Переход при К 0.

LINK(Q) <- LINK(P). SIZE(P) 4-К. Возможное окончание

с установкой гИ 4- Р -t- К.

5. Вероятно, не стоит. Недоступная область памяти непосредственно перед адресом Р станет впоследствии свободной, и ее длина увеличится на величину К; увеличение на 99 не является незначительным.

6. Идея заключается в поиске подходящего блока всякий раз в различных частях списка AVAIL. Например, можно воспользоваться блуждающим указателем (roving pointer) с именем ROVER, который работает следующим образом. На шаге Al установить Q <- ROVER. После шага А4 установить ROVER <- LINK(Q), если LINK(Q) А; в противном случае установить ROVER <- LOC (AVAIL). На шаге А2, когда впервые при некотором выполнении алгоритма А Р = А, установить Q 4- LOC (AVAIL) и повторить шаг А2. Когда Р = А во второй раз, алгоритм завершается неудачно. Таким образом, ROVER будет стремиться указывать на случайные места в списке AVAIL и размеры окажутся более сбалансированными. В начале программы установите ROVER 4- LOC (AVAIL). Необходимо также устанавливать ROVER равным LOC (AVAIL) каждый раз, когда блок, адрес которого равен текущему значению ROVER, удаляется из списка AVAIL. (Впрочем, иногда полезно иметь в начале памяти блоки малого размера, как в случае метода первого подходящего; например, в конце памяти может храниться последовательный стек. В таких ситуациях можно уменьшить время поиска с помощью деревьев, как предложено в упр. 6.2.3-30.)

7. 2000, 1000 с запросами на выделение блоков размером 800, 1300.

[Пример, когда работает метод наихудшего подходящего, но не работает метод наилучшего подходящего, был предложен Р. Д. Вейландом (R. J. Weiland).]

8. На шаге Al установить М 4- оо, R 4- А. На шаге А2, если Р = А, перейти к шагу Аб. На шаге A3 перейти к шагу А5 (а не к шагу А4). Добавить следующие шаги.

ENT2

AVAIL

ENT1

O.KLINK)

OVERFLOW

СМРА 0.2(SIZE)

0.2(SIZE)

JANZ

0.2(LINK)

O.KLINK)

0.2(SIZE)

0,2(SIZE)

INCl



А5. [Наилучший подходящий?] Если М > SIZE(P), установить R •(- Q и М <- SIZE(P). Затем установить Q «- Р и вернуться к шагу А2.

Л6. [Найден ли блок?] Если R = Л, алгоритм завершается неудачно. В противном случае установить Q 4- R, Р 4- LINK(Q) и перейти к шагу А4.

9. Очевидно, что если нам везет и мы находим блок с SIZE(P) = N, то найден наилучший подходящий блок и дальнейший поиск на этом прекращается. (Если используются блоки лишь нескольких разных размеров, это происходит достаточно часто.) Если применить метод "помеченной границы" наподобие использованного в алгоритме С, можно содержать список AVAIL в рассортированном по размерам блоков виде. При этом длительность поиска в среднем может быть снижена до половины длины списка (или даже до меньшей величины). Однако наилучшим решением представляется размещение списка AVAIL в виде структуры сбалансированного дерева, описываемого в разделе 6.2.3, в случае, если список имеет достаточно большой размер.

10. Необходимо сделать следующие изменения. Шаг В2: вместо "Р > РО" вставить "Р > РО".

Шаг ВЗ: вставить "Если P0-t-N>PHP7iA, установить Р <- LINK(P) и повторить шаг ВЗ".

Шаг В4: вместо "Q-i-SIZE(Q) = РО" вставить "Q-i-SIZE(Q) > РО", а вместо "SIZE(Q) <-SIZE(Q)-t-N" -"SIZE(Q) <-РО-t-N - Q".

11. Если РО > ROVER, на шаге BI вместо Q <- LOC(AVAIL) можно установить Q <- ROVER. Если в списке AVAIL имеется п элементов, среднее количество итераций на шаге В2 составляет (2п + 3)(п -t- 2)/6(п -Ь 1) = п -Ь § -Ь О (). Например, если п = 2, будет получено 9 равновероятных ситуаций, в которых Р1 и Р2 указывают на два существующих свободных блока.

РО < Р1 Р1 < РО < Р2 Р2 < РО ROVER = Р1 1 I 1 2

ROVER = Р2 1 2 I 1

ROVER = LOC (AVAIL) 1 2 3

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

l{il)<hQHl)Hl))-mhQ)-i-

12. Al. Установить Р <- ROVER, F <- 0.

А2. Если Р = LOC(AVAIL) и F = О, установить Р <- AVAIL, F <- 1 и повторить шаг А2. Если Р = LOC (AVAIL) и F О, алгоритм завершается неудачно.

A3. Если SIZE(P) > N, перейти к шагу А4; в противном случае установить Р <- LINK(P) и вернуться к шагу А2.

А4. Установить ROVER LINK(P), К <- SIZE(P) -N. Если К < с (где с -константа > 2), установить LINK (LINK (P-t-D) <- ROVER, LINK(ROVER-t-l) <- LINK(P-t-l), L <- P; в противном случае установить L <- P-t-K, SIZE(P) •(- SIZE(L-l) <- K, TAG(L - 1) <- "-", SIZE(L) <- N. И наконец, установить TAG(L) <- TAG(L -t- SIZE(L) - 1) <- "-t-". I

13. rll = P, rX = F, rI2 = L.

LINK EQU 4:5

SIZE EQU 1:2

TSIZE EQU 0:2

TAG EQU 0:0



rA <-N.

Сдвиг в поле SIZE

ENTX

F<-0.

ROVER

P <- ROVER.

CMPA

0,1(SIZE)

Переход, если N < SIZE(P).

O.KLINK)

P <- LINK(P).

ENT2

-AVAIL,1

rI2<-P-L0C(AVAIL).

J2NZ

JXNZ

OVERFLOW

ENTX

Установить F 4- 1.

AVAIL(LINK)

P <- AVAIL.

O.KLINK)

ROVER

ROVER <- LINK(P).

O.KSIZE)

rA = К SIZE(P) -N.

CMPA

Переход, если К > с.

l.KLINK)

rI3<f-LINK(P-t-l).

0.3(LINK)

LINK(rI3) 4-ROVER.

1.2(LINK)

LINK(ROVER-t-1) <-rI3.

ENT2

L <- P

O.KSIZE)

rI3 <- SIZE(P).

O.KSIZE)

SIZE(P) <-K.

O.KSIZE)

INC2

L <- P-t-K.

LDAN

O.KSIZE)

rA <--K.

-1,2(TSIZE)

SIZE(L - 1) <- K, TAG(L - 1) <-

rI3 <- N.

0,2(TSIZE)

TAG(L) <- "+", установить также SIZE(L)

INC3

-1.3(TAG>

TAG(L + SIZE(L) - 1) <- "-t-". 1

rI3.

14. (a) Это поле необходимо для определения начала блока на шаге С2. Его можно заменить (возможно, с преимуществом перед исходным расположением) связью с первым словом блока (см, также упр. 19) (Ь) Это поле необходимо, так как иногда нужно выделить более N слов (например, если К = 1) и при освобождении надо знать количество выделявшейся памяти.

15, 16. rll = РО, г12 = Р1, г13 = F, г14 = В, г16 s -N.

D1 LDI РО

LD2 O.KSIZE)

ENN6 0,2

INC2 0.1

LD5 0,2(TSIZE)

J5N D4 D2 LD5 -l.KTSIZE)

J5N D7

N <-PI

SIZE(PO). -PO-t-N.

Перейти к шагу D4, если TAG (PI) = D2.

Перейти к шагу D7, если TAG(P0 - 1) =



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