您好,我一直在研究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))
,是这样的是吗?
欢迎任何帮助。
答案 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
我们需要添加外循环的执行。这对应于平均 greatst 质数因子。对于 1
O(n / logn + loglogn)
现在 n / logn 是这里更重要的术语,因此可以简化为:
O(n / logn)