Для анализа среднего случая быстрого выбора необходимо учитывать, насколько вероятно, что два алгоритма сравниваются во время алгоритма для каждой пары элементов и при условии случайного поворота . Из этого мы можем получить среднее количество сравнений. К сожалению, анализ, который я покажу, требует более длительных вычислений, но это чистый анализ среднего случая, в отличие от текущих ответов.
Давайте предположим, что поле, из которого мы хотим выбрать k
-й самый маленький элемент, является случайной перестановкой [1,...,n]
. Элементы поворота, которые мы выбираем в ходе алгоритма, также можно рассматривать как заданную случайную перестановку. Во время алгоритма мы всегда выбираем следующий возможный опорный пункт из этой перестановки, поэтому они выбираются равномерно случайным образом, так как каждый элемент имеет такую же вероятность появления, что и следующий возможный элемент в случайной перестановке.
Существует одно простое, но очень важное наблюдение: мы сравниваем только два элемента i
и j
(с i<j
) тогда и только тогда, когда один из них выбран в качестве первого элемента поворота из диапазона [min(k,i), max(k,j)]
. Если сначала будет выбран другой элемент из этого диапазона, они никогда не будут сравниваться, потому что мы продолжаем поиск в подполе, где хотя бы один из элементов i,j
не содержится в.
Из-за вышеприведенного наблюдения и того факта, что стержни выбираются равномерно случайным образом, вероятность сравнения между i
и j
составляет:
2/(max(k,j) - min(k,i) + 1)
(Два события из max(k,j) - min(k,i) + 1
возможностей.)
Мы разбили анализ на три части:
max(k,j) = k
, следовательно i < j <= k
min(k,i) = k
, следовательно k <= i < j
min(k,i) = i
и max(k,j) = j
, следовательно i < k < j
В третьем случае знаки менее равных опущены, потому что мы уже рассматриваем эти случаи в первых двух случаях.
Теперь давайте немного запачкаемся в вычислениях. Мы просто суммируем все вероятности, так как это дает ожидаемое количество сравнений.
Дело 1
Дело 2
Аналогично случаю 1, поэтому это остается в качестве упражнения. ;)
Дело 3
Мы используем H_r
для числа r-й гармоники, которое увеличивается примерно как ln(r)
.
Заключение
Все три случая нуждаются в линейном числе ожидаемых сравнений. Это показывает, что quickselect действительно имеет ожидаемое время выполнения в O(n)
. Обратите внимание, что, как уже упоминалось, наихудший случай - O(n^2)
.
Примечание: идея этого доказательства не моя. Я думаю, что это примерно стандартный анализ случаев быстрого выбора.
Если есть какие-либо ошибки, пожалуйста, сообщите мне.