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

RIGHT

LEFT

DOWN

(d) Пример; 3 + + xyz + - 3xz

Корень

Я) (

±

Рис. 28. Представление полиномов на основе связей, направленных в четыре стороны. Заштрихованные поля узлов обозначают данные, которые не имеют никакого отношения к рассматриваемому вопросу.



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

Алгоритм А {Сложение полиномов). Этот алгоритм складывает полином (Р) с полиномом (Q) при условии, что Р и Q являются указательными переменными, которые указывают на корни различных полиномиальных деревьев, подобных показанным на рис. 28. По завершении работы этого алгоритма полином (Р) останется в исходном неизменном виде, а полином (Q) будет содержать искомую сумму.

А1. [Проверка типа полинома.] Если DOWN(P) = Л (т. е. .если Р указывает на константу), то ни разу не устанавливать или устанавливать Q -f- DOWN(Q) до тех пор, пока не выполнится условие DOWN(Q) = А, и перейти к шагу A3. Если DOWN(P) ф Л, то при DOWN(Q) = А или CV(Q) < CV(P) перейти к шагу А2. В противно.м случае, если CVCQ) = CV(P), установить Р DOWN(P), Q <-DOWN(Q) и повторить этот шаг. Если CV(Q) > CV(P), установить Q DOWN(Q) и повторить этот шаг. (На шаге Al будут найдены два подобных члена в складываемых полиномах нли указано на необходилюсть вставки новой переменной в текущем месте полинома (Q).)

А2. [Вставка по направлению вниз.] Установить R AVAIL, S -f- DOWN(Q). Если S ф А, установить UP(S) <- R, S -f- RIGHT(S) и, если EXP(S) ф О, повторять эту операцию до тех пор, пока не получится EXP(S) = 0. Установить UP(R) <- Q, DOWN(R) DOWN(Q), LEFT(R) R, RIGHT(R) R, CV(R) f-CV(Q) и EXP(R) -f- 0. Наконец, установить CV(Q) CV(P) и DOWN(Q) -f- R, a затем вернуться к шагу Al. ("Фиктивный" нулевой полином вставляется сразу под узлом NODE(Q), чтобы составить пару с полиномо.м, найденным внутри дерева Р. Обработка связей на этом шаге выполняется очень просто и может быть легко выведена с помощью схемы "до и после", как показано в разделе 2.2.3.)

A3..[Пара найдена.] (Здесь Р и Q указывают на соответствующие члены данных полиномов, поэтому можно приступать к сложению.) Установить CV(Cl) <- CV(Q) -bCV(P). Если сумма равна нулю и если EXP(Q) ф О, перейти к шагу А8. Если EXP(Q) = О, перейти к шагу А7.

А4. [Продвижение влево.] (После успешного сложения одного члена перейдем к следующему члену, который нужно сложить.) Установить Р LEFT(P). Если ЕХР(Р) = О, перейти к шагу А6. В противном случае ни разу не устанавливать или устанавливать Q <- LEFT(C)) до тех пор, пока не выполнится условие EXP(Q) < ЕХР(Р). Затем, если EXP(Q) = ЕХР(Р), вернуться к шагу А1.

А5. [Вставка справа.] Установить R <= AVAIL. Установить UP(R) UP(Q), DOWN(R) Л, CV(R) <- О, LEFT(R) <- Q, RIGHT(R) RIGHT(Q), LEFT (RIGHT (R)) R, RIGHT(Q) r- R, EXP(R) EXP(P) и Q R. Вернуться к шагу Al. (Необходимо вставить новый член в текущей строке справа от узла NODE(Q) в соответствии со степенями текущего члена полинома (Р). Как и на шаге .Л.2, эту операцию легче понять, если составить схему "до и после".)

А6. [Возвращение вверх.] (Обход строки полинома (Р) полностью завершен.) Установить Р UP(P).



А7. [Перевод Q на соответствующий уровень.] Если UP(Р) =Л, перейти к шагу ЛИ. В противном случае ни разу не устанавливать или устанавливать Q 4- UP(Q) до тех пор, пока не выполнится условие CV(UP(Q)) = CV(UP(P)). Вернуться к шагу А4.

А8. [Удаление нулевого члена.] Установить R <- Q, Q <- RIGHT(R), S <- LEFT(R), LEFT(Q) <- S, RIGHT(S) <- Q и AVAIL < R. (Удаление выполнено, поэтому удаляется строка полинома (Q).) Если теперь EXP(LEFT(P)) = О и Q = S, перейти к шагу А9; в противном случае вернуться к шагу А4.

А9. [Удаление полинома-константы.] (Аннулирование членов вызвало сокращение полинома до константы, поэтому строка полинома (Q) удаляется.) Установить R 4- Q, Q <- UP(Q), DOWN(Q) DOWN(R), CV(Q) CV(R) и AVAIL R. Установить S DOWN(Q). Если S ф A, установить UP(S) <- Q, S <- RIGHT(S) и, если EXP(S) Ф 0, повторять эту операцию до тех пор, пока не получится EXP(S) = 0.

А10. [Обнаружение нуля?] Если DOWN(Q) = Л, CV(Q) = О и EXP(Q) ф О, установить Р UP(P) и перейти к шагу А8, в противном случае перейти к шагу А6.

All. [Прекращение вьшолнения алгоритма.] Ни разу не устанавливать или устанавливать Q <- UP(Q) до тех пор, пока не получится UPCQ) = Л (с переводом указателя Q на корень этого дерева).

Данный алгоритм вьшолняется гораздо быстрее, чем алгоритм 2.2.4А, если полином (Р) имеет мало членов, а полином (Q) -много, так как в процессе сложения совершать обход всего полино.ма (Q) необязательно. Читателю будет очень полезно вручную выполнить алгоритм А, складывая полином ху - - xyz - + Zxz с полиномом, показанным на рис. 28. (Этот случай пе предназначен для демонстрации эффективности данного алгоритма, но позволяет ознакомиться со всеми его шагами и представить все сложные ситуации, которые следует обработать.) Дальнейшее обсуждение алгоритма А приводится в упр. 12 и 13.

Показанное на рис. 28 представление для полиномов от произвольного количества переменных не является "наилучшим". Например, в главе 8 будет рассмотрен другой формат п])едставления полиномов, а также некоторые арифметические алгоритмы па основе вспомогательного стека, которые по сравнению с алгоритмом А обладают существенными преимуществами в отношении концептуальной простоты. Алгоритм А интересен для нас в основно.м тем, как в нем организована обработка деревьев с большим количеством связен.

УПРАЖНЕНИЯ

* 1. [20] Можно ли восстановить связи LLINK, зная только поля LTAG, INFO и RTAG узлов в последовательном порядке уровней, подобном (8)? (Иначе говоря, не являются ли поля LLINK избыточными в представлении (8) и поля RLINK - в представлении (3)?)

2. [22] (Задача Бсркса, Уоррена и Ранта, Afath. Сотр. 8 (1954), 53-57.) Пусть деревья (2) хранятся в памяти в прямом порядке с указанием степеней

DEGREE 2 0 1 0 3 1 0 1 0 0 INFO ABCKDEHFJG [Ср. с (9), где они приведены в обратном порядке.] Создайте алгоритм, аналогичный алгоритму F, для оценки локально определенной функции узлов, выполнив обход этого прсдставлс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