这个难题(解决leetcode问题650)(问题2)的时间复杂度是多少?

时间:2019-06-27 11:56:54

标签: python-3.x algorithm time-complexity

您好,我一直在研究https://leetcode.com/problems/2-keys-keyboard/,并遇到了这个动态编程问题。

在空白页上以“ A”开头,完成后得到数字n,则页面上应有n倍“ A”。要注意的是,您只能进行2次操作复制(并且您只能复制页面上当前的A总数)并粘贴->查找在页面上获得n个“ A”的最小操作数。

我解决了这个问题,但随后在leetcode的讨论部分找到了一个更好的解决方案->我不知道它的时间复杂度。

    def minSteps(self, n):
        factors = 0
        i=2
        while i <= n:
            while n % i == 0:
                factors += i
                n /= i
            i+=1
        return factors

i的工作方式永远不会比p的最大素数n大,因此外部循环为O(p),内部while循环为基本上是O(logn),因为我们在每次迭代中都将n /= i除。

但是从我的角度来看,我们对内循环总计O(logn)进行除法,而对外循环O(p)进行除法,因此使用聚合分析此函数基本上是O(max(p, logn)),是这样的是吗?

欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

您的推理是正确的: O(max(p,logn))给出了时间复杂度,假设算术运算需要固定的时间。对于任意大 n 来说,这种假设是不正确的,它不适合机器的固定大小的数字存储,并且您需要具有non-constant时间复杂度的Big-Integer运算。但是我会忽略这一点。

当不是输入(而是从输入中得出)时,用 p 表示复杂性仍然很奇怪。您的输入仅为 n ,因此仅用 n 表示复杂性就很有意义。

最坏的情况

很明显,当 n 为素数时,算法为 O(n) -内部循环永远不会迭代。

对于素数 n ,该算法将比 n + 1 花费更多的时间,因为即使 n + 1 的最小因子也是如此。 (即2),将使外循环的迭代次数减半,而在内循环中仅添加1块恒定功。

所以 O(n)是最坏的情况。

平均情况

对于一般情况,我们注意到 n 的除法次数是 n 具有主要因子的次数(计算重复项)。例如,对于 n = 12 ,我们有3个除法,即 n = 2·2·3

1 average number of prime factors接近 loglogn + B ,其中 B 是一个常数。因此,我们可以说整个内循环执行的平均时间复杂度是 O(loglogn)

我们需要添加外循环的执行。这对应于平均 greatst 质数因子。对于 1 this average approaches C.n/logn,我们有:

O(n / logn + loglogn)

现在 n / logn 是这里更重要的术语,因此可以简化为:

O(n / logn)