Изменения

Перейти к: навигация, поиск

Поиск k-ой порядковой статистики

3054 байта добавлено, 20:27, 14 мая 2011
Новая страница: «{{В разработке}} {{Определение |definition= '''<tex>k</tex>-ой порядковой статистикой''' набора элементо…»
{{В разработке}}

{{Определение
|definition=
'''<tex>k</tex>-ой порядковой статистикой''' набора элементов линейно упорядоченного множества называется такой его элемент, который является <tex>k</tex>-ым элементом набора в порядке сортировки
}}

== Модификация QuickSort ==
=== Описание алгоритма ===

Будем использовать процедуру рассечения массива элементов из алгоритма сортировки QuickSort. Пусть нам надо найти <tex>k</tex>-ую порядковую статистику, а после рассечения опорный элемент встал на позицию <tex>m</tex>. Возможно три случая:

* '''k = m'''. Порядковая статистика найдена.
* '''k < m'''. Рекурсивно ищем <tex>k</tex>-ую статистику в первой половине массива.
* '''k > m'''. Рекурсивно ищем <tex>(k - m - 1)</tex>-ую статистику во второй половине массива.

=== Код алгоритма ===

Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля.

int findOrderStatistic(int[] array, int k) {
int left = 0, right = array.length;
while (true) {
int mid = partition(array, left, right);

if (mid == k) {
return array[mid];
}
else if (k < mid) {
right = mid;
}
else {
k -= mid + 1;
left = mid + 1;
}
}
}

=== Анализ времени работы ===

Аналогично QuickSort, может возникнуть такой же худщий случай (процедура '''partition''' возвращает каждый раз левую или правую границу рассматриваемой части), при котором время работы составит <tex>\Omega(n^2)</tex>. Однако, если считать, что '''partition''' возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как <tex>O(n)</tex>.
Анонимный участник

Навигация