Есть небольшая проблема с вашим анализом. Как вы заметили, для каждого базового случая вы должны вызывать функцию n раз. Но некоторые из этих вызовов являются общими для других базовых случаев. Другими словами, вы считаете один и тот же вызов несколько раз.
Это означает, что хотя сложность определенно не может быть больше, чем n * 2 ^ n
, на самом деле она может быть ниже.
Чтобы лучше оценить сложность, вы можете посчитать фактическое количество вызовов функции permutation
. Один из способов сделать это - рассмотреть возможные значения переменной str
.
str
будет двоичной строкой длиной, меньшей или равной n
. Кроме того, каждый вызов функции permutation
получает уникальное значение str
. Это означает, что количество вызовов функции равно числу двоичных строк длины <= n. </p>
Сколько таких строк? 1 + 2 + 4 + ... + 2 ^ n = 2 ^ (n + 1) - 1
Итак, количество раз, которое вызывается permutation
, равно O(2^n)
.
Но каждый вызов включает в себя операции str + "0"
и str + "1"
. Эти операции занимают O(n)
время. Таким образом, чистая временная сложность операции: O(n * 2^n)
, но по несколько иным причинам, чем вы изначально думали.