Похоже, что в алгоритме есть ошибка, потому что после рекурсивного вызова возможно, что узлы, которые появляются в комбинации, также появятся в connectedSoFar, поэтому проверка того, что connectedSoFar.size () + сочетание.size () равно n, кажется неправильной , так как он может сосчитать узел дважды.
В любом случае, для анализа алгоритма у вас есть 2 d элементов в powerset; каждая операция в ветви «elase» занимает O (n) времени, потому что connectedSoFar и комбинация вместе не могут содержать более n узлов. Добавление элементов в connectedSoFar тогда занимает O (n log n) времени, потому что | комбинация | & Leq; п. Итерация по узлам комбинации происходит O (n) раз; внутри него есть операция O (d) для построения хэш-множества k, а затем рекурсивный вызов.
Обозначим тогда сложность процедуры через X (n), где n - параметр. У вас есть
X (n) ~ 2 d (n + n log n + n (d + X (n - 1)))
потому что в рекурсивном вызове вы добавили в граф хотя бы одну вершину, поэтому на практике параметр n в рекурсивном вызове практически уменьшается как минимум на один.
Упростите это до
X (n) ~ 2 d (n (1 + d + log n + X (n - 1)))
, поскольку d является постоянной величиной, отметьте D = 2 d , исключите постоянную 1, и вы получите
X (n) ~ D n (d + log n + X (n - 1))
, который вы можете проанализировать как
X (n) ~ (2 d ) n n! (d + log n)
, показывающий, что ваш алгоритм действительно является временным боровом:)