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

Таблица 1

ПРИБЛИЗИТЕЛЬНЫЕ ДАННЫЕ О ХОДЕ СОРТИРОВКИ МЕТОДОМ КАСКАДНОГО СЛИЯНИЯ

Ленты

Проходы (с копированием)

Проходы (без копирования)

Отношение роста

2.078 In S +0.672

1.504 In S +0.992

1.6180340

1.235 In S +0.754

1.102 In S +0.820

2.2469796

0.946 In S +0.796

0.897 In S +0.800

2.8793852

0.796 In S +0.821

0.773 In S + 0.808

3.5133371

0.703 In S +0.839

0.691 In S +0.822

4.1481149

0.639 In S +0.852

0.632 In S +0.834

4.7833861

0.592 In 5+ 0.861

0.587 In S +0.845

5.4189757

0.555 In S +0.869

0.552 In 5+ 0.854

6.0547828

0.397 In S +0.905

0.3971nS +0.901

12.4174426

(Т - 1)-путевое слияние в то время как каскадная использует (Т - 1)-путевое, (Т - 2)-путевое, (Т - 3)-путевое и т. д. В действительности же для шести и более лент каскадная схема асимптотически лучше, чем многофазная. Как мы видели в разделе 5.4.2, высокий порядок слияния не является гарантией эффективности. В табл. 1 показаны характеристики выполнения каскадного слияния по аналогии с подобной таблицей из раздела 5.4.2.

Нетрудно, рассуждая "в обратном направлении" от конечного состояния (1,0, ...,0), вывести "точные распределения" для каскадного слияния. В случае для шести лент имеем следующее.

Уровень

п + 1

an + bn + Cn+dn + Cn

an + bn + Cn+dn

ап+Ьп+Сп

an + bn

Отметим интересное свойство этих чисел - их относительные величины являются также и длинами диагоналей правильного {2Т - 1)-угольника. Например, пять диагоналей одиннадцатиугольника на рис. 73 имеют относительные длины, очень близкие к 190, 175, 146, 105 и 55! Мы докажем ниже в этом разделе такой замечательный факт и увидим, что значения относительного времени, затрачиваемого на (Т - 1)-, {Т - 2)-, ..., 1-путевое слияние, приблизительно пропорциональны квадратам длин этих диагоналей.

Начальное распределение серий. Если число начальных серий в действительности не есть число Фибоначчи, можно, как обычно, вставить фиктивные серии. Даже из поверхностного анализа ситуации ясно, что метод приписывания фиктивных серий здесь работать не будет, так как при каскадном слиянии всегда выполняются



Рис. 73. Геометрическая интерпретация каскадных чисел.

полные проходы. Если имеется 190 начальных серий, то каждая запись обрабатывается пять раз, как в приведенном выше примере, но если имеется 191 серия, то, очевидно, следует увеличить уровень. Теперь каждая запись будет обрабатываться шесть раз. К счастью, на практике можно избежать такого резкого скачка. Дэвид Э. Фергюсон (David Е. Ferguson) сумел так распределить начальные серии, что многие операции во время первой фазы слияния свелись к копированию содержимого ленты. Обойдя такие копирования (просто изменив "логические" номера ленточных устройств по отношению к "физическим" номерам, как в алгоритме 5.4.2D), получим относительно плавный переход от одного уровня на другой, как изображено на рис. 74.

Предположим, что {a,b,c,d,e), где a>b>c>d>e - точное распределение. Изменив соответствие между логическими и физическими ленточными устройствами, можно представить, что реальное распределение - {e,d,c,b,a), т. е. а серий на Т5, b - на Т4 и т. д. Следующее точное распределение - это {a + b + c + d + e, a + b+c+d, a + b + c, a + b, a); если же ввод исчерпывается прежде, чем мы достигаем этого следующего уровня, будем считать, что на лентах содержится соответственно (Dl,1)2,1)3,1)4,5) фиктивных серий, где

Di<a + b + c+d, D2<a + b + c, D3 < а + b, D4 < а, d5 = 0;

Di>D2>D3>D4> Db. (2)

Мы вольны представлять себе, что эти фиктивные серии появляются на лентах в любом удобном месте. Предполагается, что первый проход слияния сначала даст а серий посредством пятипутевого слияния, затем - b серий посредством четырехпутевого и т. д. Наша цель состоит в размещении фиктивных серий таким образом, чтобы заменить слияние копированием. Удобно выполнять первый проход слияния следующим образом.

1. Если Di = а, то вычесть а из всех Di, D2, D3, D4 и заявить, что Т5 - результат слияния. Если D4 < а, то произвести слияние а серий с лент Т1 по Т5, используя минимально возможное число фиктивных серий на лентах от Т1 до Т5



-1-1 1 Mill

1 1 1 Mill

1 1 1 Mill

[ < 1

7-»4

Г = 5

Г = 8 Г=10

10 20 50 100 200

Начальные серии, 5

500 1000 2000

5000

Рис. 74. Эффективность каскадного слияния с распределением по алгоритму D.

так, чтобы новые значения Di, D2, d3, D4 удовлетворяли соотношениям

£>i<6 + c + d, D2<b + c, Въ<Ь, £)4 = 0; Di > >-С»з >-С»4. (3)

Таким образом, если Di было первоначально < 6 + с, ни одна фиктивная серия с этой ленты на данном шаге не используется. В то же время, если 6+с < D2 < а+6+с, используется ровно D-b- с фиктивных серий.

2. (Этот шаг аналогичен шагу 1, но с некоторым "сдвигом".) Если D = 6, то вычесть Ь из всех Di, D2, Dsn объявить, что Т4 - результат слияния. Если D3 < Ь, то слить b серий с лент Т1-Т4, уменьшая, если необходимо, число фиктивных серий, чтобы достичь

Di<6 + c, D2<b, D3 = 0; I>i > i?2 >-Da-

3. И так далее.

Метод распределения серий по лентам Фергюсона можно проиллюстрировать, рассмотрев переход с уровня 3 на уровень 4 в (1). Допустим, что на "логических" лентах (Т1,..., Т5) содержалось соответственно (5,9,12,14,15) серий и что необходимо довести это количество до (55,50,41,29,15). Данная процедура кратко описана в табл. 2. Сначала помещаем девять серий на Т1, затем (3,12) - на Т1 и Т2 и т. д. Если ввод исчерпывается, скажем, на шаге (3, 2), то "сэкономленная величина" составляет 15 -f- 9 -Ь 5. Это означает, что мы избавляемся от пятипутевого слияния



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