Поиск k-ой порядковой статистики — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «{{В разработке}} {{Определение |definition= '''<tex>k</tex>-ой порядковой статистикой''' набора элементо…»)
 
(Код алгоритма)
Строка 19: Строка 19:
 
Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля.
 
Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля.
  
  int findOrderStatistic(int[] array, int k) {
+
  '''int''' findOrderStatistic('''int[]''' array, '''int''' k) {
   int left = 0, right = array.length;
+
   '''int''' left = 0, right = array.length;
   while (true) {
+
   '''while''' ('''true''') {
     int mid = partition(array, left, right);
+
     '''int''' mid = partition(array, left, right);
 
   
 
   
     if (mid == k) {
+
     '''if''' (mid == k) {
       return array[mid];
+
       '''return''' array[mid];
 
     }
 
     }
     else if (k < mid) {
+
     '''else if''' (k < mid) {
 
       right = mid;
 
       right = mid;
 
     }
 
     }
     else {
+
     '''else''' {
 
       k -= mid + 1;
 
       k -= mid + 1;
 
       left = mid + 1;
 
       left = mid + 1;

Версия 20:48, 14 мая 2011

Эта статья находится в разработке!


Определение:
[math]k[/math]-ой порядковой статистикой набора элементов линейно упорядоченного множества называется такой его элемент, который является [math]k[/math]-ым элементом набора в порядке сортировки


Модификация QuickSort

Описание алгоритма

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

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

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

Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура 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 возвращает каждый раз левую или правую границу рассматриваемой части), при котором время работы составит [math]\Omega(n^2)[/math]. Однако, если считать, что partition возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как [math]O(n)[/math].