【问题标题】:Determining the big-O runtime of the loop?确定循环的大 O 运行时间?
【发布时间】:2017-08-05 09:07:37
【问题描述】:

问。就 N 而言,以下最坏情况的 big-oh 运行时是多少?假设 x 是一个正整数,其中 N = math.log(x, 2)。

def bigOh(x):
    c = 1
    while (x > 0) :
        (x, c) = (x // 42, c + 1)
    x = 1
    while (x ** 2 < c) :
        x += 1
    return x

我无法计算第二个 while 循环所涉及的步骤数。第一个应该执行log x / log 42 次数,即在O(N).

对于第二个循环,每次都会检查(x + n) ** 2 &lt; c,其中 n 是第 n 次迭代,但在此之后我几乎陷入了困境。

有人可以帮忙吗?

编辑:第一个循环在 O(N) 中运行,而不是在 cmets 中指出的 O(log N)。

【问题讨论】:

  • 您可能喜欢将while 语句单行排列的紧凑风格,但它们使我们更难掌握您的代码来审查它。起初我以为你有一个语法错误,直到我看到':'埋在这些行的中间。请为您的while 语句使用标准缩进正文重新格式化。我知道这听起来很挑剔,但是如果您发布人们可以快速轻松地掌握的示例代码,您会在 SO 上得到更好的响应。
  • 感谢您的建议。我已经重新格式化了代码 sn-p。
  • 提示:while x ** 2 &lt; c: 将循环与while x &lt; sqrt(c): 相同的次数
  • 其他提示:您最初声明 N = log(x),所以 log x / log 42 与 N 成正比,而不是 log(N)。
  • 在第一个循环中,c 计算循环的次数,所以它与 N 成正比。第二个循环运行 sqrt(c) 次,所以我们总共有 O(N+sqrt( N))

标签: python big-o


【解决方案1】:

第一个循环执行log x / log 42 次。就N = log x / log 2而言,这只是O(N)的时间。

在第一个循环之后,c ~ O(log x)。 第二个循环在x ~ sqrt(c) 时终止。因此它应该循环sqrt(c) 次,即O(sqrt(log x)) = O(sqrt(N))。 因此bigOh的总运行时间为O(N + sqrt(N)) = O(N)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2021-08-13
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多