Рандомизированный прогон выбора в O (n).посмотрите на этот анализ .
Algorithm :
Randomly choose an element
split the set in "lower than" set L and "bigger than" set B
if the size of "lower than" is j-1 we found it
if the size is bigger, then Lookup in L
or lookup in B
Общая стоимость равна сумме:
- Стоимость разбиения массива размером n
- Стоимость поиска в L или стоимость поиска в B
Отредактировано: я пытался реструктурировать свой пост
Вы можете заметить, что:
- Мы всегда идем дальше в наборе с большим количеством элементов
- Количество элементов в этом наборе составляет
n - rank(xj)
1 <= rank(xi) <= n
Итак 1 <= n - rank(xj) <= n
- Случайность элемента
xj
напрямую влияет на случайность числа элементов, которые больше xj
(и которые меньше xj
)
, еслиxj - выбранный элемент, тогда вы знаете, что стоимость составляет O(n) + cost(n - rank(xj))
.Давайте назовем rank(xj) = rj
.
. Чтобы дать хорошую оценку, нам нужно принять ожидаемое значение общей стоимости, которое является
T(n) = E(cost) = sum {each possible xj}p(xj)(O(n) + T(n - rank(xj)))
xj
случайным.После этого это чистая математика.Мы получаем:
T(n) = 1/n *( O(n) + sum {all possible values of rj when we continue}(O(n) + T(n - rj))) )
T(n) = 1/n *( O(n) + sum {1 < rj < n, rj != i}(O(n) + T(n - rj))) )
Здесь вы можете изменить переменную, vj = n - rj
T(n) = 1/n *( O(n) + sum { 0 <= vj <= n - 1, vj!= n-i}(O(n) + T(vj) ))
Мы ставим O (n) вне суммы, получим коэффициент
T(n) = 1/n *( O(n) + O(n^2) + sum {1 <= vj <= n -1, vj!= n-i}( T(vj) ))
Мы помещаем O (n) и O (n ^ 2) снаружи, теряем коэффициент
T(n) = O(1) + O(n) + 1/n *( sum { 0 <= vj <= n -1, vj!= n-i} T(vj) )
Проверьте ссылку на то, как это вычисляется.
Длянерандомизированная версия:
Вы говорите сами: В avto randomizedPartition возвращает середину массива .
Именно поэтому работает рандомизированный алгоритм, и именно он используется для построения детерминированного алгоритма.В идеале вы хотите выбрать опорную точку детерминистически, чтобы она давала хорошее разделение, но наилучшее значение для хорошего разделения - это уже решение!Таким образом, на каждом шаге они хотят получить достаточно хорошее значение: "по крайней мере 3/10 массива ниже оси и по крайней мере 3/10 массива выше" .Чтобы добиться этого, они делят исходный массив на 5 на каждом шаге, и снова это математический выбор.