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

503 509 512 612 653 677 703 765 897 908]

503 509 [512 612 653 677 703 765 897 908]

503 509 [512 612 653] 677 703 765 897 908

503 509 512 612 [653] 677 703 765 897 908

503 509 512 612 653 677 703 765 897 908]

503]509 512 612 653 677 703 765 897 908

503]509 512 612 653 677 703 765 897 908

503 509 512 612 653 677 703 765 897 908

503 509 512 612 653 677 703 765 897 908

Рис. 4. Примеры бинарного поиска.

Программа В {Бинарный поиск). Как и в программах из раздела 6.1, полагаем, что Ki представляет собой полное слово, находящееся по адресу KEY + i. В приведенном коде гП = /, г12 = и, г13 = г.

START

ENT1 1

BI. Инициализация. I <r- 1.

ENT2 N

u<-N.

JMP 2F

Переход к шагу В2.

JE SUCCESS

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

ENTl 1,3

В5. Изменение 1. 1 i + 1.

ENTA 0,1

C+1-

В2. Получение средины.

INCA 0,2

C + 1-

тА +- 1 + и.

SRB 1

C + 1-

г А <- [rA/2J. (Изменяется т

STA TEMP

C + 1-

CMPl TEMP

C+1-

JG FAILURE

C+1-

Переход, если и < 1.

LD3 TEMP

г +- midpoint.

LDA К

ВЗ. Сравнение.

СМРА KEY,3

JGE 5B

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

ENT2 -1,3

В4. Изменение и. и+- i - 1.

JMP 2B

Переход к шагу В2.

Эта процедура не вполне удачно реализуется на компьютере MIX в связи с небогатой арифметикой индексных регистров. Время работы составляет (18С - 105--12)и, где С = С1 + С2 - количество произведенных сравнений (количество выполнений шага ВЗ) и 5 = 1 при успешном (или О при неудачном) исходе поиска. Обратите внимание, что операция в строке 08 - SRB (shift right binary 1 - побитовый сдвиг вправо на единигу) - допустима лишь в бинарных версиях MIX; в общем случае ее следует изменить на MUL =1 2+1=, что приведет к увеличению времени работы программы до (26С - 185 -I- 20)и.

Представление в виде дерева. Для лучшего понимания работы алгоритма В представим описанную процедуру в виде бинарного дерева принятия решения, как показано на рис. 5, при N = 16.

[061 087 154 170 275 426

061 087 154 170 275 426

061 087 154 170 275 426

061 087 154 170 275 426

b) Поиск 400:

[061 087 154 170 275 426

[061 087 154 170 275 426

061 087 154 170 [275 426

061 087 154 170 [275] 426

061 087 154 170 275] [426




Рис. 5. Дерево сравнений, соответствующее бинарному поиску дая Л = 16.

При Л = 16 сначала согласно алгоритму сравниваются К я Kg; на рисунке это показано корневым узлом (?). Затем, если К < Kg, алгоритм переходит в левое поддерево и сравниваются К с К4; точно так же при К > Kg будет выполняться работа с правым поддеревом. Неудачный поиск приведет в один из внешних "квадратных" узлов, пронумерованных от [о] до Щ, например узел [Т] будет достигнут нами только при Кв < К < Ку.

Бинарное дерево, соответствующее бинарному поиску по N записям, может быть построено следующим образом: если N = О, дерево представляет собой просто один узел [о]. В противном случае корневой узел -

(МЮ-

При этом левое поддерево представляет собой бинарное дерево с \N/2] - 1 узлами, а правое - с [N/2\ узлами (все числа в узлах увеличены на "Л/2]).

Точно так в виде бинарного дерева с N узлами, в котором все узлы пронумерованы от 1 до N, может быть представлен любой алгоритм поиска в упорядоченной таблице длиной N (если только алгоритм не выполняет излишние сравнения). Верно и обратное - любое бинарное дерево соответствует некоторому методу поиска в упорядоченной таблице; достаточно просто пометить узлы

© ш © а -

UV-1

В симметричном порядке слева направо.

Если аргумент поиска алгоритма В равен Кю, алгоритм выполняет сравнения К > Kg, К < Ki2, К = Кю- На рис. 5 это соответствует пути от корня дерева к вершине (w). Точно так поведение алгоритма В при поиске других ключей соответствует некоторому пути из корня дерева. Метод построения бинарных деревьев, соответствующих алгоритму В, позволяет легко доказать с помощью индукции по N следующую теорему.

Теорема В. Для 2*~ < iV < 2* успешный поиск по алгоритму В требует (min 1, шах fc) сравнений; неудачный поиск при 2*~ < Л < 2* - 1 требует к-1 либо к сравнений.



Дальнейший анализ бинарного поиска. (Читателям, для которых математика не представляет интереса, рекомендуем пропустить материал до формулы (4).) Представление в виде дерева показывает нам также простой путь вычисления среднего числа сравнений. Пусть - среднее число сравнений при успешном поиске; предположим также, что все N ключей равновероятны в качестве аргумента поиска. Среднее число сравнений при неудачном поиске - С; все Л -I- 1 интервалов внутри и вне граничных значений также равновероятны. Тогда по определению длин внутреннего и внешнего путей

длина внутреннего пути дерева длина внешнего пути дерева Cn = 1 +---, С =--j-;-.

Из 2.3.4.5-(3) видно, что длина внешнего пути всегда на 2Л больше длины внутреннего пути. Отсюда следует несколько неожиданное соотношение между и Cf:

Cn = (i + J)cm-1. (2)

Эта формула, выведенная Т. И. Хиббардом (Т. N. Hibbard) [JACM 9 (1962), 16-17], справедлива для всех методов, соответствующих бинарным деревьям; другими словами, она справедлива для всех методов, не использующих излишних сравнений. Дисперсия среднего числа сравнений при успешном поиске также может быть выражена через дисперсию среднего числа сравнений при неудачном поиске (см. упр. 25).

На основании приведенных выше формул мы можем сказать, что "наилучший" путь поиска методом сравнения тот, дерево которого имеет минимальную длину внешнего пути среди всех бинарных деревьев с N внутренними узлами. К счастью, можно доказать, что в этом смысле алгоритм В оптимален для любого N (как помните, в упр. 5.3.1-20 было доказано, что бинарное дерево имеет минимальную длину пути тогда и только тогда, когда все внешние узлы расположены не более чем на двух соседних уровнях). Отсюда следует, что длина внешнего пути дерева, соответствующего алгоритму В, равна

(7V + l)([lg7VJ+2)-2L8J+i. (3)

(См. 5.3.1-(34).) Из формул (2) и (3) мы можем вычислить точные средние значения количества сравнений, полагая, что все аргументы поиска равновероятны.

ЛГ = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 C;v = l li 1 2 2i 2 2f 2 21 2 3 3 3 3 3 3 Cn = 1 If 2 2 2 2f 3 3 ЗА 3 3 ЗЩ 31 ЗИ 4 4

В общем случае при к = [Ig N\ мы имеем следующее:

= А; + 1 - (2*+1 -к- 2)/N = IgTV - 1 + 6 -Ь (jfc + 2)/N, Cjv = ife + 2 - 2*+V( + 1) = + 1) + «>

где 0 < б,б < 0.0861 (см. 5.3.1-(35)).

Итак, алгоритм В никогда не делает более [Ig Л] -I-1 сравнений; среднее количество сравнений при успешном поиске составляет около IgA - 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