【问题标题】:Compute Big-O for a program in Java为 Java 程序计算 Big-O
【发布时间】:2018-04-14 14:35:24
【问题描述】:

我只是想问一下这个程序的 Big-O 是什么。我想是n/2,但我不确定。

public static boolean isPrime(int k) {
    if (k <= 1)
        return false;
    else if (k > 2 && k%2 == 0)
        return false;
    else 
    {
        for(int i = 3;i<=k/2;i+=2)
            if (k % i == 0)
                return false;
    }
    return true;
}

【问题讨论】:

  • 一个带有“简单”边界条件和增量的循环 => O(n) (= O(n/2) ).
  • "我认为它是 n/2" - 常量在大 O 表示法中被忽略,因为 n/2 = 1/2 * n,它实际上是 = O(n)

标签: java time big-o complexity-theory


【解决方案1】:

复杂度为O(k),即线性时间

k素数的最坏情况执行。然后你的算法将执行所有行,直到return true;

特别是您完全执行了for 循环,该循环产生(k / 4) - 3 迭代:

for (int i = 3; i <= k/2; i += 2)

所以你得到O((k / 4) - 3),即O(k)

【讨论】:

  • &lt;pedantic&gt; 虽然没有错,但“正确的表示法”应该是 f(k) = k/2 ∈ O(n) =)(取决于使用的定义或约定,您可以将 替换为 =)@987654333 @
  • 好吧,O(k / 2) = O(k) 是正确的。两者都表示相同的集合。但我明白你想说的:)
  • 只检查 k/4 个元素,而不是 k/2 个。
  • @A.H.你是对的,没有看到i += 2。已编辑。
  • 正如@Zabuza 所暗示的,每个f(x) = c * xc ∈ ℝ⁺ 在传递给O 函数时都映射到相同的函数集。因此O(k/4) = O(k/2) = O(k)^^
猜你喜欢
  • 2015-07-28
  • 2013-04-30
  • 2023-03-31
  • 1970-01-01
  • 2013-04-29
  • 2022-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多