
- •1Введение
- •2Сортировки
- •2.1Сортировки массивов
- •2.2Сортировка простым включением
- •2.3Сортировка простым выбором
- •2.4Сортировка простым обменом
- •2.5Сравнение простых сортировок
- •2.6 Сортировка шелла
- •2.7Пирамидальная сортировка
- •2.8Быстрая сортировка
- •2.9Поиск медианы и квантилей
- •2.10Сравнение сортировок
- •3Поиск подстроки в строке
- •3.1Поиск в строке
- •3.2Простой поиск в строке
- •3.3Поиск в строке. Алгоритм боуера-мура
- •4Генерация перестановок
- •4.1Генерация перестановок последовательности натуральных чисел
- •4.2Генерация перестановок элементов в антилексикографическом порядке
- •4.3Генерация перестановок за одну транспозицию элементов
- •4.4Генерация перестановок за одну транспозицию соседних элементов
- •5Генерация подмножеств
- •5.1Генерация всех подмножеств множества
- •5.2Генерация m -элементных подмножеств множества натуральных чисел
- •Var m: integer; {Размер подмножества}
- •Var I, j, p: integer;
- •5.3Генрация k-компонентных выборок на множестве {0, 1}
- •Var k: integer; {Количество нулей в кортеже}
- •I: integer;
- •Var I, j, p: integer;
- •If Finish then Break {Exit};
- •6Генерация разбиений
- •6.1Разбиение целых чисел
- •Var I, j: integer;
- •Var j: integer;
- •Var I, j, k: integer;
- •Var d, l, Sum: integer;
- •6.2Разбиение множеств
- •/1, 2, 3/ И /4/ затем /1, 2/ и /3, 4/ и т.Д. }
- •I, j, k, r, s: integer;
- •If not Flag2 then
- •If Flag1 then
- •If Forvd[j] then { j движется вперед}
- •7Обходы бинарных деревьев
- •7.1Процедуры прохождения бинарных деревьев
- •8Поиск на бинарных деревьях
- •8.1Процедуры поиска на бинарных деревьях
- •Рекомендованная литература
2.9Поиск медианы и квантилей
Медианой последовательности из n элементов называется элемент, значение которого меньше (или равно) значениям половины из n элементов и больше (или равно) значениям другой половины из n элементов. Например, для последовательности
-
44
55
11
33
99
01
22
77
элемент 33 является медианой.
Естественное решение задачи поиска медианы связано с сортировкой. Действительно если отсортировать массив, то затем можно выбрать средний элемент. Но это достаточно трудоёмко.
Процедура разделения Partition позволяет потенциально найти медиану значительно быстрее.
Более того, этот метод поиска медианы даёт возможность решать и более общую задачу: поиск квантиля.
Квантилем уровня k последовательности из n элементов называется элемент, являющийся k-ым по величине значением из n-элементов, или k-ым по порядку значением отсортированной последовательности из n-элементов.
Тогда медиана является частным случаем квантиля для k = n/2.
Алгоритм нахождения медианы предложен К. Хоором в 1970 г. Он работает следующим образом.
Прежде всего, применяется операция разделения Partition с левой границей L = 1 и правой границей R = n и с x = a[k], выбранным в качестве разделяющего значения (границы), где k – квантиль, определяемый условиями задачи. В результате операции разбиения получаются значения индексов i и j, такие, что при i > j имеют место условия:
a[h] <= x для всех h < i
a[h] >= x для всех h > j
Возможны три варианта полученного разбиения:
Выбранная граница x = a[k] была слишком мала; в результате граница между двумя частями ниже искомого значения квантиля уровня k.
-
<=
>=
L j i k R
Тогда процесс разбиения следует повторить для подмассива:
a[i], ..., a[r]
Выбранная граница x = a[k] была слишком велика, в результате граница между двумя частями выше искомого значения квантиля уровня k.
-
<
>=
L k j i R
Операцию разбиения следует повторить для подмассива:
a[L]...a[J].
3. Значение искомого квантиля уровня k лежит в интервале j < k < i.
L j k i R
Таким образом, следует повторять процесс разбиения (while L < R do) до появления случая 3, т. е. результат достигается методом последовательных приближений или итеративно.
Программа поиска медианы Find имеет вид:
procedure Find (var A: TArr; var K: integer) ;
var L, R, I, J,: integer ;
X, W: Item;
begin
N := Length (A);
L := 0;
R := N-1;
while L < R do
begin
X := A[K];
I := L;
J := R;
repeat {Split}
while A[I].Key < X.Key do I := I + 1;
while X.Key < A[J] .Key do J := J - 1;
if I <= J then
begin
W := A[I];
A[I] := A[J];
A[J] := W;
I := I+1;
J := J-1;
end;
until I > J;
if J < K then L := I;
if K < I then R := J;
end;
end; {Find}
Этот алгоритм эффективен для достаточно больших массивов. Количество сравнений при нахождении медианы или других квантилей пропорционально n, что делает алгоритм достаточно экономным. Этот алгоритм намного эффективнее чем первоначальная сортировка массива, а затем уже поиск требуемого квантиля.
Примечание. Механизмы поиска квантилей имеют еще одно важное применение. Они могут использоваться для построения очередей из элементов, имеющих разный приоритет. Благодаря чему, элемент с наибольшим (наименьшим) значением приоритета всегда является квантилем уровня n или квантилем уровня 1.