Краткий ответ, O(choose(N+k, N))
, что совпадает с O(choose(N+k, k))
.
Вот длинный ответ о том, как туда добраться.
У вас верная версия основного вопроса. С k
вложенными циклами ваша сложность будет O(N^k)
, так как N
уходит в бесконечность. Однако, поскольку k
и N
оба различаются, поведение становится более сложным.
Давайте рассмотрим противоположную крайность. Предположим, что N
является фиксированным, а k
меняется.
Если N
равно 0, ваше время является постоянным, потому что внешний цикл завершается неудачно на первой итерации. Если N = 1
, тогда ваше время равно O(k)
, потому что вы проходите все уровни вложенности только с одним выбором и имеете только один выбор каждый раз. Если N = 2
, то происходит что-то более интересное, вы проходите вложение снова и снова, и это занимает время O(k^N)
. И вообще, при фиксированном N
время составляет O(k^N)
, где один фактор k
обусловлен временем, затрачиваемым на прохождение вложения, и O(k^(N-1))
- тем, где продвигается ваша последовательность. Это неожиданная симметрия!
А что будет, если k
и N
оба большие? Какова временная сложность этого? Что ж, вот что дает вам интуицию.
Можем ли мы описать все времена, когда мы достигаем самой внутренней петли? Да!
Рассмотрим k+N-1
слотов. k
из них "вошли в еще один цикл" и N-1
из них ". Мы увеличили индекс на 1". Я утверждаю следующее :
- Они соответствуют 1-1 последовательности решений, с помощью которых мы достигли самого внутреннего цикла. Это можно увидеть, посмотрев, какие индексы больше других и на сколько.
- Запись "еще один цикл" в конце - это работа, необходимая для перехода к самому внутреннему циклу для этой итерации, которая не привела к другим итерациям цикла.
- Если
1 < N
, то на самом деле нам нужен еще один, чтобы в уникальной работе дойти до конца.
Теперь это выглядит как беспорядок, но есть хитрость, которая неожиданно упрощает это.
Хитрость заключается в следующем. Предположим, что мы взяли один из этих шаблонов и вставили один дополнительный ", который мы продвинули индекс на 1" где-то на этом последнем отрезке "ввели еще один цикл" записей в конце. Сколько есть способов сделать это? Ответ в том, что мы можем вставить эту последнюю запись между любыми двумя точками в последнем отрезке, включая начало и конец, и есть еще один способ сделать это, чем есть записи. Другими словами, количество способов сделать это соответствует тому, сколько уникальной работы было проделано для этой итерации!
И что означает , так это то, что общая работа пропорциональна O(choose(N+k, N))
, что также O(choose(N+k, k))
.
Стоит знать, что из нормального приближения к биномиальной формуле, если N = k
, то получается O(2^(N+k)/sqrt(N+k))
, который действительно растет быстрее, чем полином. Если вам нужно более общее или точное приближение, вы можете использовать приближение Стирлинга для факториалов в choose(N+k, N) = (N+k)! / ( N! k! )
.