я создал следующий псевдокод, но я не уверен, как рассчитать его сложность:Временная сложность рекурсивной функции, где п размер уменьшает случайно
(псевдокод)
MyFunction(Q, L)
if (Q = empty) return
M = empty queue
NM = empty queue
M.Enqueue(Q.Dequeue)
while (Q is not empty)
pt = Q.Dequeue()
if (pt.y > M.peek().y) M.Enqueue(pt)
else NM.Enqueue(pt)
L.add(M)
if (NM is not empty) MyFunction(NM, L)
return L;
MyFunction получает множество добротность n точек и список L, в котором мы сохраним k подмножеств Q (1 < = k < = n). Когда мы вычисляем первое подмножество, мы проходим через все n точек Q и выбираем те, которые принадлежат первому подмножеству. Для второго подмножества мы проходим через все n точек Q, кроме тех, которые уже находятся в первом подмножестве и т. Д.
Таким образом, каждый рекурсивный вызов число точек будет уменьшаться на целое число x до тех пор, пока количество точек не будет 0. Это целое число x может отличаться от одного рекурсивного вызова другому (это может быть любое значение между 1 и n (n - текущее количество точек))
Какова была бы сложность моего алгоритма?
Я думал, что мое рекуррентное соотношение будет что-то вроде этого:
T (0) = 1
Т (п) = Т (п-х) + ап
Правильно ли это? и если да, то как я могу это решить?