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

Результат выполнения программы выглядит так:

on entry: 34567567891234

after make heap(): 98677553641234

after pop heap(): 8767455364123

after push heap(): 17 7874563641235

after sort heap(): 1233445566778 17

После вызова make heap() элементы сортируются в виде кучи:

98677553641234

Если преобразовать эту последовательность в бинарное дерево, вы увидите, что значение каждого узла меньше либо равно значению его родительского узла (рис. 9.1). Алгоритмы push heap() и pop heap() изменяют элементы так, что инвариант структуры бинарного дерева (любой узел не больше своего родительского узла) остается неизменным.


Рис. 9.1. Элементы кучи в виде бинарного дерева

Алгоритмы упорядоченных интервалов

Алгоритмы упорядоченных интервалов требуют, чтобы элементы исходных интервалов были упорядочены по своим критериям сортировки. Обычно эти алгоритмы работают гораздо эффективнее своих аналогов для неупорядоченных интервалов (как правило, они обладают логарифмической, а не линейной слож-гюстью). Алгоритмы упорядоченных интервалов могут использоваться с итераторами, которые не являются итераторами произвольного доступа, но в этом случае сложность оказывается линейной, поскольку им приходится последовательно перебирать элемент за элементом. Впрочем, количество сравнений все равно может остаться логарифмическим.

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



В ассоциативных контейнерах определены специальные функции, аналогичные по назначению представленным далее алгоритмам. При поиске по заданному значению или ключу следует использовать эти функции вместо алгоритмов.

Поиск элементов

Следующие алгоритмы предназначены для поиска значений в упорядоченных интервалах.

Проверка npnqfrcTBMfl элемента

bool

binary search (Forwardlterator beg. Forwardlterator end. const T& value) bool

binary search (Forwardlterator beg. Forwardlterator end. const T& value. BinaryPredicate op)

О Обе формы проверяют, содержит ли упорядоченный интервал [beg,end) элемент со значением value.

О В необязательном параметре ор передается бинарный предикат, определяющий критерий сортировки: op(elem1,elem2).

О Чтобы определить позинию искомого элемента, воспользуйтесь функниями lower bound(), upper bound() и equal range() (см. с. 402).

О Перед вызовом интервал должен быть упорядочен по соответствующему критерию сортировки.

О Сложность логарифмическая для итераторов произвольного доступа, линейная в остальных случаях (не более \og(numberOfElements)+2 сравнений, но для итераторов, не являющихся итераторами произвольного доступа, выполняется линейное количество операпий перебора, вследствие чего сложность оказывается линейной).

Пример использования алгоритма blnary search():

algo/bsearchl.cpp #1nclude "algostuff-hpp" using namespace std:

Int maInO

list<1nt> coll:

INSERT ELEMENTS(coll,1,9): PRINT ELEMENTS(con):

Проверка существования элемента со значением 5 1f (b1nary search(con,beginO. coll.endO. 5)) ( cout « "5 1S present" « endl:



else {

cout « "5 is not present" « endl;

Проверка существования элемента со значением 42 If (binary search(coll .beginO, coll.endO, 42)) { cout « "42 is present" « endl;

else {

cout « "42 is not present" « endl;

Результат выполнения программы выглядит так:

12 3 4 5 6 7 8 9

5 is present

42 is not present

Проверка присутствия нескольких элементов

bool

includes (Inputlteratorl beg. Inputlteratorl end.

InputIterator2 searchBeg. InputIterator2 searchEnd)

bool

includes (Inputlteratorl beg. Inputlteratorl end.

InputIterator2 searchBeg. InputIterator2 searchEnd. BinaryPredicate op)

О Обе формы проверяют, содержит ли зшорядоченный интервал [beg,end) все элементы зшорядоченного интервала [searchBeg,searchEnd), и возвращают результат в виде логической величины. Иначе говоря, для каждого элемента интервала [searchBeg,searchEnd) должен существовать равный элемент в интервале [beg, end). Если некоторые элементы интервала [searckBeg,searckEnd) равны, то в интервале [beg,end) должно присутствовать такое же количество дубликатов. Таким образом, интервал [searchBeg,searchEnd) должен быть подмножеством интервала [beg,end).

О В необязательном параметре ор передается бинарный предикат, определяющий критерий сортировки: op(elem1,elem2).

О Перед вызовом оба интервала должны быть упорядочены по одному критерию сортировки,

о Сложность линейная (не более 2x(numberOfElements+searchElements)-\ сравнений).

Пример использования алгоритма lncludes():

algo/includes.cpp finclude "algostuff.hpp" using namespace std;



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