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

35. [26] Если в левостороннее дерево добавить связи UP (ср. с анализом деревьев с тремя связями в разделе 6.2.3), то получим возможность исключать из приоритетной очереди произвольный узел Р следующим образом: слить LEFT(P) и RIGHT (?) и поместить полученное поддерево на место Р, затем исправлять поля DIST предков узла Р до тех пор, пока не будет достигнут либо корень, либо узел, поле DIST которого не меняется.

Докажите, что при этом никогда не потребуется изменить более чем 0(log ) полей DIST, несмотря даже на то, что дерево может содержать очень длинные восходящие пути.

36. [18] {Замещение наиболее давно использованной страницы.) Во многих операционных системах используется алгоритм следующего типа: над набором узлов допустимы две onepaiyin: (i) использование узла и (ii) замещение наиболее давно использованного узла новым. Какая структура данных облегчает нахождение наиболее давно использованного узла?

37. [НМ32] Пусть ел? (А:) - предполагаемое расстояние между самым большим к-м элементом и корнем в случайной пирамиде из элементов и пусть е(А:) = lim?-+oo е;у(А:). Тогда е(1) = О, е(2) = 1, е(3) = 1.5, а е(4) = 1.875. Найдите значениеасимптотического выражения для е{к) через 0{к~).

38. [М21] Найдите простое рекуррентное соотношение для мультимножества Miv размеров поддеревьев в пирамиде или в полном бинарном дереве, имеющем внутренних узлов.

5.2.4. Сортировка методом слияния

Слияние* означает объединение двух или более упорядоченных массивов в один упорядоченный массив. Можно, например, слить подмассивы 503 703 765 и 087 512 677 и получить 087 503 512 677 703 765. Простой способ сделать это - сравнить два наименьших элемента, вывести наименьший из них и повторить эту процедуру. Начав с

получим

затем

087 503 512

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

Алгоритм М {Двухпутевое слияние). Этот алгоритм осуществляет слияние упорядоченных массивов a;i < < • • • < и у1 < у2 < • • • < Уп в массив .zi < Z2 < • • • <

Zm+n (рис. 29).

Ml. [Начальная установка.] Установить г-f- 1, j-f- 1, к 1.

* В англоязычной литературе термину слияние соответствуют два равнозначных термина - merging и collating. - Прим. перев.

677



Ml. Начальная установка

М2. Найти

наименьший элемент

МЗ. Вывести Xi

Массив X исчерпан

М4. Передать yj, - ,Уп

М5. Вывести ?/j

Массив у исчерпан

Мб. Передать Xi,...,Xm

Рис. 29. Слияние xi < • • • < Хт с j/i < < j/„.

М2. [Найти наименьший элемент.] Если Х{ < yj, перейти к шагу МЗ; в противном случае перейти к шагу М5.

МЗ. [Вывести Х{.] Установить Zk <- xi, к <- к + 1, i <- i + 1. Если г < тп, вернуться к шагу М2.

М4. [Передать у,...,у„.] Установить [zk,. . ,Zm+n) {yj,---,yn) и завершить выполнение алгоритма.

М5. [Вывести yj.] Установить Zk yj, к <г- к + \, j <г- j + 1. Если j <п, вернуться к шагу М2.

Мб. [Передать xi,... ,Хт-] Установить {zk,. ,Zm+n) {xi, .,Хт) и завершить выполнение алгоритма.

В разделе 5.3.2 будет показано, что эта простая процедура, по существу, - наилучший из возможных способов слияния на компьютере с обычной архитектурой, когда тип. (Но, если тп гораздо меньше п, можно разработать более эффективные алгоритмы сортировки, хотя в общем случае они довольно сложны.) Алгоритм М без существенной потери эффективности можно немного упростить, добавив в конец исходных массивов искусственных "стражей" (ограничивающие элементы x,n+i = Уп+1 = оо) И остановившись перед выводом оо. Анализ алгоритма М приведен в упр. 2.

Общий объем операций, выполняемых алгоритмом М, по существу, пропорционален m -f- п, откуда понятно, почему считается, что слияние - более простая задача, чем сортировка. Однако задачу сортировки можно свести к слияниям, сливая все более длинные подмассивы до тех пор, пока не будет рассортирован весь массив. Такой подход можно рассматривать как развитие идеи сортировки методом вставок: вставка нового элемента в упорядоченный массив - частный случай слияния при п = 1. Чтобы ускорить процесс вставок, можно рассмотреть вставку нескольких элементов за один раз, группируя несколько операций, а это естественным образом приведет к общей идее сортировки методом слияния. С исторической точки зрения метод слияний - один из самых первых методов сортировки при помощи компьютеров; он был предложен Джоном фон Нейманом (John von Neumann) еще в 1945 году (см. раздел 5.5).



Довольно подробно слияние рассматривается в разделе 5.4 в связи с алгоритмами внешней сортировки, а в настоящем разделе речь пойдет о сортировке в оперативной памяти с произвольным доступом.

В табл. 1 проиллюстрирована сортировка методом слияния, когда "свечка сжигается с обоих концов", подобно тем процедурам просмотра элементов массива, которые применялись при быстрой сортировке, поразрядной обменной сортировке и т. д. Будем анализировать исходный массив слева и справа, двигаясь к середине. Пропустим пока первую строку и рассмотрим переход от второй строки к третьей. Слева мы видим восходяшую серию 503 703 765, а справа, если читать справа налево, имеем серию 087 512 677. Слияние этих двух последовательностей дает подмассив 087 503 512 677 703 765, который помещается слева в строке 3. Затем ключи 061 612 908 в строке 2 сливаются с 170 509 897 и результат (061 170 509 612 897 908) записывается справа в строке 3. Наконец, 154 275 426 653 сливается с 653 (перекрытие обнаруживается прежде, чем оно может привести к нежелатель"ным последствиям) и результат записывается слева. Точно так же строка 2 получается из строки 1 исходного массива.

Таблица 1

СОРТИРОВК.\ МЕТОДОМ ЕСТЕСТВЕННОГО ДВУХПУТЕВОГО СЛИЯНИЯ

503 087 512 061 908 170 897 275 Гб53 426 154 509 612 677 765 703

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

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

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

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

Вертикальными линиями в табл. 1 отмечены границы между сериями. Это так называемые ступеньки вниз, где меньший элемент следует за большим. В общем случае в середину массива возникает двусмысленная ситуация, когда при движении с обоих концов считывается один и тот же ключ; это не приведет к осложнениям, если проявить чуточку осторожности, как в следующем алгоритме. Такой метод по традиции Нс1зывается "естественным" слиянием, потому что в нем используются серии, которые "естественно" образуются в исходном массиве.

Алгоритм N {Сортировка методом естественного двухпутевого слияния). При сортировке записей i?i,..., Rn используются две области памяти, в каждой из которых может содержаться N записей. Для удобства обозначим записи, находящиеся во второй области, через Rn+i , R2N, хотя в действительности запись Rn+i может и не примыкать непосредственно к Rn- Начальное содержимое записей Rn+i , , R2N не имеет значения. После завершения сортировки ключи будут упорядочены таким образом: iTi < • • • < Kn (рис. 30).

N1. [Начальная установка.] Установить s <- 0. (При s = О будем пересылать записи из области {Ri,...,Rn) в область {Rn+iR2N), при s = 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 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