python-3.x - 这个函数的时间复杂度是多少,它生成一个数字的所有唯一因子组合?

标签 python-3.x algorithm math time-complexity factors

你好,我刚刚解决了 leetcode 254 [ https://leetcode.com/problems/factor-combinations/] , 该算法的目标是找到给定数字 n 的所有唯一因子组合(例如:对于 n = 8 我们返回 [[2 x 2 x 2], [2 x 4]] )并编写如下代码:

def getFactors(self, n: int) -> List[List[int]]:
    def helper(n, cur, path, ind, factors):
        if cur == n:
            res.append(path[:])
            return

        for i in range(ind, len(factors)):
            if cur * factors[i] <= n:
                path.append(factors[i])
                helper(n, cur * factors[i], path, i, factors)
                path.pop()

    res = []
    helper(n, 1, [], 0, [num for num in range(2, n) if n % num == 0])
    return res if res != [[]] else []

这个算法的工作方式是我遍历所有因素并乘以 cur因为我正在迭代并且只要cur * factors[i] <= n我可以将该因素添加到我的 path并继续递归。

我无法计算出 n 的时间复杂度尽管。我可以说在最坏的情况下递归树的深度是log n (如果 2 x 2 x 2 ... x 2 是 2 的幂,那将是 n)但我一直在理解这棵树的分支因子。

欢迎任何计算此算法时间复杂度的帮助,但我将非常感谢以直观的方式来看待它(我可以在采访中复制的东西)...也欢迎使用更正式的方法。

编辑 1:

所以我可以说这次重复有log(n)分支机构(因素数量)和log(n)最坏情况下的深度导致运行时间为 O(log(n)^log(n))这个推理好吗?

编辑 2:

然而,另一种看待它的方式是我们有 O(log(n))因素,我们只是在做所有可能组合的一个子集,即 2^n锻炼从而导致2^log(n) = n不同的解决方案。对于每个 n我们拥有的解决方案 log(n) (树深度)乘法产生 O(nlog(n))运行时...所以我的问题 --> 哪个分析是正确的?

最佳答案

一个观察:

n 的因子数在最坏情况下发生在 n 是连续多个最小素数的乘积时。 IE。 2*3*5*7*11等

我很好奇这个数字作为 n 的函数增长的速度有多快(同样,在最坏的情况下)。使用 Python,并查看前 100 个左右的素数,n 的以 10 为底的对数似乎比 n 中的因子数增长得快一点。对于小值,数字几乎相同,但差异不断变大,在 70 个左右的因子(即 - 70 个第一个素数的乘积)之后,对数是因子数的两倍多。

另一种表达方式是 [n 的因子数]log n 增长得慢。

关于python-3.x - 这个函数的时间复杂度是多少,它生成一个数字的所有唯一因子组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607349/

相关文章:

Python urllib 卡住特定的 URL

python - 如何线程化一个 wxpython 进度条 GUI?

java - 查找二维数组的标准差

C++ 索引语法 : two libraries use different indexing syntax: 0 based and 1 based index

python - 2 和问题 : given an unsorted list of ints, 查找两个元素的总和是否等于给定目标。如何让我的代码更 Pythonic?

python - 如何创建整数列表的二维列表并设置特定值

algorithm - 优化有向无环图中的连接查询

algorithm - 英语文本词典比较

algorithm - 找到向量中的最大距离

swift - 21如何计算! (21 阶乘)快速?