【问题标题】:Confused on Big-O Notation对 Big-O 表示法感到困惑
【发布时间】:2012-03-02 15:51:38
【问题描述】:

好的,我有一个简单的问题要问所有正在准备一个简单问题的程序员。

对于我的计算机科学 II 课,我们正在学习 Big-Oh 表示法,我已经记下了大部分内容,但我仍然对示例的一些语义感到困惑。

这里的一切都是用 Java 编写的。

我的教授在课堂上给了我们这些例子,但我很幸运,我没有写下答案。

一)

int count = 0; 
    for (int i = 1; i <= n; i++) 
        for (int j = n; j > 1; j-­--­-) 
            for (int k = 1; k < n; k = k + 2) 
                count++;

b)

int count = 0; 
for (int i = 1; i <= n; i++) 
    for (int j = n; j > 1; j-­--­-) 
        for (int k = 1; k < 1000; k = k + 2) 
            count++;

c)

int count = 0; 
    for (int i = 1; i <= 1000000; i++) 
        for (int j = i; j > 500; j-­--­-) 
            for (int k = 1; k < 10500; k = k + 2) 
                count++;

d)

int count = 0; 
int j = 1; 
for (int i = 1; i < n; i++) { 
        while (j < n) { 
            j++;
            count++; 
        } 
        j = 1; 
    }

e)

int count = 0; 
int i = n; 
while (i > 1) 
{ 
    count++; i = i / 2; 
}

好的,这是我的答案/思考过程:

a) N * N * (N / 2) = N^3/2,全部简化为 O(N^3) 表示法

b) N * N * 500,全部简化为 O(N^2)

c) 这是我主要困惑的一个,你有三个 for 循环,但都迭代了确切的次数。我的猜测是 O(1),但我不知道......

d) N * N = N^2,所以 O(N^2)

e) 每次除以一半,所以 log(n) = O(log(n)) [都以 2 为底]

那么任何人都可以检查我的思维过程,看看我是否遗漏了什么?提前非常感谢您!

【问题讨论】:

  • Big Oh 完全是另外一回事。 SO的话题。 :)
  • 哎呀:P不知道。非常感谢!
  • 你所有的答案都是正确的..(是的,c.将是 O(1))。只是,这将是奥斯汀所说的大 O……其他一切都很好……:)

标签: java algorithm big-o computer-science


【解决方案1】:

是的 (C) 是 O(1),因为它都是常数。

【讨论】:

    【解决方案2】:

    在所有这些示例中,count 对于每个工作单元都会增加一次。如果你能弄清楚countn之间的关系,那么你就知道程序的渐近顺序了。

    很高兴你解决了问题。下一步是根据实际情况检查您的计算。针对n 的不同值运行代码,打印出count,并根据真实数据检查您的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2019-07-27
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多