<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.138.25&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.138.25&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.55.138.25"/>
		<updated>2026-04-18T02:53:58Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_k-%D0%BE%D0%B9_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=71886</id>
		<title>Поиск k-ой порядковой статистики</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_k-%D0%BE%D0%B9_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=71886"/>
				<updated>2019-10-14T19:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;95.55.138.25: запятые&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''&amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ой порядковой статистикой''' набора элементов линейно упорядоченного множества называется такой его элемент, который является &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ым элементом набора в порядке сортировки&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Модификация QuickSort ==&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Будем использовать процедуру рассечения массива элементов из алгоритма сортировки [[Быстрая сортировка|QuickSort]]. Пусть нам надо найти &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ую порядковую статистику, а после рассечения опорный элемент встал на позицию &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;. Возможно три случая:&lt;br /&gt;
&lt;br /&gt;
* '''k = m'''. Порядковая статистика найдена.&lt;br /&gt;
* '''k &amp;lt; m'''. Рекурсивно ищем &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-ую статистику в первой половине массива.&lt;br /&gt;
* '''k &amp;gt; m'''. Рекурсивно ищем &amp;lt;tex&amp;gt;(k - m - 1)&amp;lt;/tex&amp;gt;-ую статистику во второй половине массива.&lt;br /&gt;
&lt;br /&gt;
=== Код алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде считаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается), и возвращает индекс опорного элемента. Также считается, что массив индексируется с нуля.&lt;br /&gt;
&lt;br /&gt;
 '''int''' findOrderStatistic('''int[]''' array, '''int''' k) {&lt;br /&gt;
   '''int''' left = 0, right = array.length;&lt;br /&gt;
   '''while''' ('''true''') {&lt;br /&gt;
     '''int''' mid = partition(array, left, right);&lt;br /&gt;
 &lt;br /&gt;
     '''if''' (mid == k) {&lt;br /&gt;
       '''return''' array[mid];&lt;br /&gt;
     }&lt;br /&gt;
     '''else if''' (k &amp;lt; mid) {&lt;br /&gt;
       right = mid;&lt;br /&gt;
     }&lt;br /&gt;
     '''else''' {&lt;br /&gt;
       left = mid + 1;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Анализ времени работы ===&lt;br /&gt;
&lt;br /&gt;
Аналогично QuickSort, может возникнуть такой же худший случай (процедура '''partition''' возвращает каждый раз левую или правую границу рассматриваемой части), при котором время работы составит &amp;lt;tex&amp;gt;\Omega(n^2)&amp;lt;/tex&amp;gt;. Однако, если считать, что '''partition''' возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем оценивать количество сравнений. При поиске статистики в массиве размера &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; функция '''partition''' (точнее, одна из распространённых вариаций) совершает не более &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; сравнений. Далее, в зависимости от &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; выбирается левая или правая половины (или вообще алгоритм завершает работу). Оценку проводим сверху, то есть, будем считать, что каждый раз выбирается большая половина.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;T(n) \le \frac 1n \sum\limits_{k = 1}^n \left ( T \left ( \max \left \{k - 1; n - k \right \} \right ) + n - 1 \right ) =&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;= n - 1 + \frac 1n \sum\limits_{k = 1}^n T(\max \{k - 1; n - k\}) = n - 1 + \frac 2n \sum\limits_{k = \lfloor n/2 \rfloor}^{n - 1} T(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что &amp;lt;tex&amp;gt;T(k) \le ck&amp;lt;/tex&amp;gt; для некоторой константы &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; и всех &amp;lt;tex&amp;gt;k &amp;lt; n&amp;lt;/tex&amp;gt; (будем доказывать оценку по индукции). Тогда верно неравенство:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;T(n) = n - 1 + \frac 2n \sum\limits_{k = \lfloor n/2 \rfloor}^{n - 1} ck&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Преобразуем сумму из правой части равенства по формуле суммы арифметической прогрессии и оценим преобразованное выражение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\sum\limits_{k = \lfloor n/2 \rfloor}^{n - 1} ck = \frac 12 \left (\left \lceil \frac n2 \right \rceil - 1 \right) \left( c \left \lfloor \frac n2 \right \rfloor + c(n - 1) \right ) \le \frac c2 \left (\frac{n + 1}2 - 1\right) \frac{3n - 2}2 = c \frac{n - 1}4 \frac{3n - 2}2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Воспользуемся полученной оценкой для оценки исходного выражения. Также, предположим, что &amp;lt;tex&amp;gt;c \ge 4&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;T(n) \le n - 1 + \frac{2c}n \frac{n - 1}4 \frac{3n - 2}2 = n - 1 + c\frac{n - 1}{2n} \frac{3n - 2}2 \le \frac c4 (n - 1) + \frac c4\left (\frac{n - 1}n (3n - 2)\right) \le&amp;lt;/tex&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\le \frac c4 (n - 1 + 3n - 2) = \frac c4 (4n - 3) \le cn&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для довершения доказательства необходима проверка базы индукции, но она тривиальна: для выборки порядковой статистики из одного элемента сравнений не требуется: &amp;lt;tex&amp;gt;T(1) = 0 &amp;lt; 4&amp;lt;/tex&amp;gt;. Итого, мы доказали, что &amp;lt;tex&amp;gt;T(n) \le 4n&amp;lt;/tex&amp;gt;, следовательно, &amp;lt;tex&amp;gt;T(n) = O(n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/BFPRT Selection algorithm — Wikipedia]&lt;br /&gt;
* Donald Knuth. The Art of Computer Programming, Volume 3: Sorting and Searching, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Section 5.3.3: Minimum-Comparison Selection, pp.207–219.&lt;/div&gt;</summary>
		<author><name>95.55.138.25</name></author>	</entry>

	</feed>