Что такое космическая сложность хвостовой рекурсивной быстрой сортировки?

Глядя на следующий хвостовой рекурсивный псевдокод быстрой сортировки

QuickSort(A[1, ..., n], lo, hi)
Input: An array A of n distinct integers, the lower index and the higher index
         // For the first call lo = 1 and hi = n
Output: The array A in sorted order

If lo = hi return
         // The array A is already sorted in this case
If lo > hi or indices out of the range 1 to n then return

Else
      Pick an index k in [lo,hi] as the pivot
              // Assume that this can be done using O(1) cells on the stack
      i = Partition(A[lo, ..., hi], k)
              // Use in-place partitioning here so assume that this can be done
              // using O(1) space on the stack

If i - lo <= hi - i
      QuickSort(A, lo, i-1) // sort the smaller half first
      QuickSort(A, i+1, hi)
Else
      QuickSort(A, i+1, hi) // sort the smaller half first
      QuickSort(A, lo, i-1)

Предполагая, что стержень выбирается с состязательностью каждый раз, когда я анализировал, что он должен иметь пространственную сложность O(logn) [что я не совсем уверен, что это правильно), но как повлияет сложность пространства, если тогда стержень будет выбран равномерно при случайный? Я довольно новичок в понимании сложности пространства во времени, поэтому любая обратная связь приветствуется!

2 ответа

Худший случай для времени - это если вы разделите массив как можно неравномернее, и это время будет O(n^2), Если вы не выполняете хвостовую рекурсию, это также будет худшим случаем для космоса.

Однако, если вы разделяете массив неравномерно и выполняете хвостовую рекурсивную сортировку, вызов сортировки большей половины не занимает места, поскольку вы просто заменяете текущий фрейм вызова. Поэтому максимальное используемое пространство - это когда вы делаете первые рекурсивные вызовы снова и снова. Что самое большее 1/2 самое большее 1/2 из... в общей сложности log_2(n) рамки вызова.

Если вы переключаетесь с наихудшего случая на средний случай с равномерно выбранной осью, это O(log(n)) снова, но с лучшей константой. Прежде всего, это не может быть больше, потому что средний случай не может превышать худший случай.

Хитрость заключается в том, чтобы доказать, что вы не можете улучшить эту границу. Чтобы продемонстрировать это, мы можем доказать, что среднее пространство для сортировки массива размера n по крайней мере C log(n+1)/(3 log(2)) где C это место для одного звонка.

По проверке это верно для n = 1, 2, ..., 7 потому что первоначальный вызов занимает место C а также log(n+1)/(3 log(2)) <= 1,

Если n больше 7, и утверждение верно до n, наш стержень разбит нас на группы размера m а также n-m где m <= n-m, По крайней мере, с равными шансами, n <= 4m и наша ожидаемая максимальная стоимость во время первого рекурсивного вызова, по крайней мере,

C 1 + f(m)
  >= C  + f(n/4 rounded up)
  >= C (3 log(2)) /(3 log(2))    + C log(n/4 + 1)/(3 log(2)))
  >  C (3 log(2)                 + log(n+1) - 2 log(2)    ) / (3 log(2)) )
   = C (log(n+1) + log(2)) / (3 log(2))

В остальное время, которое не сохраняется, и наша ожидаемая максимальная стоимость во время хвостового рекурсивного вызова, по крайней мере,

f(n-m)
  >= f(n/2 rounded down)
  >= C log(n/2 + 1/2) / (3 log(2)) # n/2
   = C (log(n+1) - log(2)) / (3 log(2))

Когда вы в среднем эти два, вы получите желаемую нижнюю границу C log(n+1) / (3 log(2)),

(Возможно, я допустил небольшую ошибку, но идея верна.)

См. Эту статью о рекурсии хвоста

В статье говорится, что Пространственная сложность рекурсивной быстрой сортировки хвоста выглядит следующим образом:

space complexity = input + O(log(n))

Несколько статей, чтобы получить более глубокое понимание, можно найти ниже:

Другие вопросы по тегам