【问题标题】:What is the time complexity of this agorithm (that solves leetcode question 650) (question 2)?这个算法的时间复杂度是多少(解决了 leetcode 问题 650)(问题 2)?
【发布时间】:2019-07-03 01:00:36
【问题描述】:

您好,我一直在研究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 永远不会大于n 的最大素数p,所以外循环是O(p),而内循环基本上是O(logn),因为我们正在划分n /= i 每次迭代。

但在我看来,我们对内循环进行了O(logn) 的总划分,而外循环是O(p),所以使用聚合分析这个函数基本上是O(max(p, logn)),这是正确的吗?

欢迎任何帮助。

【问题讨论】:

  • 是的!你是绝对正确的。
  • 嗯,但是i 循环总是转到原来的 n+1 —— n 是否改变也没关系。我认为代码应该用i=2; while i &lt;= n: ... i+=1替换for循环
  • 哎呀,你是绝对正确的,保罗感谢您的注意。这个算法基本上是 O(n) 然后 ...
  • 什么是p?你的意思是n'?
  • 您好 Jim 抱歉耽搁了,不,我的意思是 p,其中 p 是 n 的最大素数。你是对的,代码没有意义,因为我将根据 Paul Hankin 的评论对其进行修改。

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


【解决方案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)

我们需要添加外部循环的执行。这对应于平均最大素因子。对于 1 this average approaches C.n/logn,所以我们有:

      O(n/logn + loglogn)

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

      O(n/logn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多