【问题标题】:Java Big O Notation algorithmJava Big O 表示法算法
【发布时间】:2023-03-31 10:20:02
【问题描述】:

如果有人可以帮助我找到代码的大 O',请向我解释一下。

    j = 1; 
    while ( j <= n)
    {
      j = j + 2
    }

我知道选择一个随机的 n 来帮助查看循环是如何工作的。但是,我有我的同学,他们说 while(j

【问题讨论】:

  • 试试 n=10 和 n=20。模式应该变得清晰。
  • 您的循环只是运行n / 2 次,但并不意味着O(n/2) 是正确答案。
  • 好的,我现在看到了。谢谢你。我正在使用 n = 7 来尝试找到模式。你对如何选择数字来找到模式有什么建议吗?
  • 选择随机数并不能解决这些问题。您只需计算对 N 的依赖关系。这里有一个,它是线性的。
  • O(n/2) == O(n)/2 == O(n) - 线性

标签: java algorithm big-o notation


【解决方案1】:

当您需要找到任何算法的渐近复杂度时,请始终寻找最高的增长顺序。

增长顺序是算法的多项式的最高幂(对于 P 问题;NP 问题的处理方式不同)。此顺序将定义复杂性。

你有一个 while 循环,它是一个线性循环。线性表示 1 的幂/度 它是线性的,因为如果你看到在 while 循环中执行的语句,你可以这样计算:

执行 j=j+2 的时间。 = C
循环运行次数 = 任意整数 N

因此,总成本为 C*N
1 次多项式
因此复杂度为 O(N)

注意:循环确实会运行 n/2 次。这是因为您在从 1 到 3、5、7 等的每次迭代中将 j 递增 2。
建议不要选择数字来找出复杂性。使用上面提到的 cost*iterations 方法。

【讨论】:

  • No of times loop runs = any integer N。您不能仅查看循环条件来确定这是线性的,您需要弄清楚将完成多少次迭代。在这种情况下是这样,但如果你这样做了j = j * 2,它会变成次线性的。
  • 我是说代码将在线性时间内执行。即使对于 j= j*2,代码也只会执行 n 次
  • 对于j=j*2,只有 O(log n) 次迭代。
  • 是的,你是对的。忘记 j 处于 while 状态。
【解决方案2】:

您的同学几乎正确地认为 while 循环执行了 n/2 次,但并不完全正确。尝试在 while 循环中增加一个计数器,然后在 n = 0 到 9 时打印它。正确答案是 n/2 +(涉及模数的东西)。

但大 O 并不是实际的执行次数,它是最大可能执行次数的上限,忽略常数因子和低阶项。因此“/2 +(涉及模数的东西)”可以忽略。

【讨论】:

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