【问题标题】:Find an upper and lower bound of following code找到以下代码的上限和下限
【发布时间】:2019-06-08 04:25:54
【问题描述】:

我需要找到以下代码的最接近的上限和下限。我是初学者,很抱歉我的错误。

p() 的上限是 O(log(n)),下限是 O(1)

notp() 的上限是 O(log(n)),下限是 O(1)

我认为下限是 O(1) 因为如果我有 n=4 那么我进入循环并且由于 n%i==0 我调用 p() 并且它注意到它不是一个素数所以 O (1) 那么由于 i=2 另一个 notp 不会被执行。那是最糟糕的情况。

最坏的情况是我通过循环,以便 log(n),并执行 ap,上限是 O(log(n)),所以它是 O(log(n)^2),但我不是这样确定这很好,请告诉我我哪里出错了?

int i;
for (i = 2; i*i <= n; i++) {
  if (n % i == 0) {
    p();
    break;
  }
}
if(i*i > n)
  notp();

【问题讨论】:

  • 最坏的情况是 O(sqrt(N) * log N)
  • 你能向我解释一下 sqrt(N) 因为我没见过吗?
  • 上限和下限到底是什么意思? “最近的上限”通常与“最近的下限”相同。
  • for 循环在sqrt(N) 次的最坏情况下运行。并且每次,它都会调用 p() 为log N 时间。所以它是O(sqrt(N) * log N) 你可以放心地忽略最后一个并且只调用notp() 因为它只贡献log N 时间

标签: algorithm complexity-theory


【解决方案1】:

对于订单计算,通常会在有循环时将它们相乘。

for( i = 0; i < n ; i++ ){
     DoSomething(i);
}

这将是 O(n),因为循环是单一情况。

嵌套循环是

for( i = 0; i < n ; i++ ){ 
    for( j =0; j < n; j++ ){
       DoSomething(i,j);
    }
}

这变成了 O( n^2 ),因为它们是相加的。

如果你有非嵌套循环...

for( i = 0; i < n ; i++ ){
     DoSomething(i);
}


for( j = 0; j < sqrt(n) ; j++ ){
     DoSomething(j);
}

那么 O( x ), 是最大的项。这是因为对于非常大的 n,较小的 x 值无关紧要。

所以你有一个循环,即 O( sqrt( n ) )。那是因为它受到 i *i 小于 n 的限制。

然后将调用 p() 或 notp() 之一。

(我认为 p() 和 notp() 是错误的)。

重构您的代码....

int i;
for (i = 2; i*i <= n; i++) {
  if (n % i == 0) {
    /* p(); */
    break;
  }
}
if(i*i > n)
  notp();
else
  p();

所以我们有 O( sqrt(n) ) 时间加上 O( log(n) ) 的 p / notp 函数中的任何一个

O(sqrt(n) + log(n))

随着 sqrt 的增长速度快于 n,它压倒了 log(n) wikipedia Big O,将其作为最终值。

O(sqrt(n))

【讨论】:

    【解决方案2】:

    由于循环的终止条件为i*i &lt;= n,因此循环的最大可能迭代次数为sqrt(n)。由于在n % i == 0 的条件下有一个break,所以这部分的最坏情况是sqrt(n) + log(n),即O(sqrt(n))。另外,第二个条件是否成立,因为nopt()的最坏情况是O(log(n)),所以算法的最坏情况是O(sqrt(n))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多