【问题标题】:Time complexity [closed]时间复杂度
【发布时间】:2011-05-23 07:04:32
【问题描述】:

本题用于复习过去的试卷 我只想知道我是否走在正确的轨道上

1. int i=1;
2. while (i <= n) {
3.   for (int j=1; j<10; j++)
4.     sum++;
5.   i++;
6. }
7. for( int j = 1; j <= n; j++ )
8.   for( int k = 1; k <= n; k=k*2 )
9.      sum++;

1.) 语句 4 执行了多少次?
A. O(n)
B. O(n^2)
C. O(log n)
D. O (n log n)
E. 没有 以上

这里我选择了A

2.) 语句 9 执行了多少次?
A. O(n)
B. O(n^2)
C. O(log n)
D. O (n log n)
E. 以上都不是

因为第 8 行 (k=k*2) 我选择了 C

3.) 整个代码片段的运行时间是多少?
A. O(n)
B. O(n^2)
C. O(log n)
D. O(n log n)

由于O(n)+O(logn)=O(n)所以我选择了A

【问题讨论】:

  • @Neil:你为什么这么认为? (当然,这可能不是试卷的全部内容。)
  • @ShreevatsaR:可能是因为 big-O 既不是数量(“多少次是……?”)也不是持续时间(“……的运行时间是多少?”)。更好的是更准确的“......的时间复杂度是多少?”。
  • @paxdiablo:说“语句 4 的执行次数是 O(n)”是完全准确的。也就是说,数量/函数 10n 是 O(n)。 (一个完全不同的问题是,也许论文应该要求 Theta,或者要求最小的正确 O(.),但根据课程的水平,这是可以原谅的。)
  • @Neil:我不同意。教程序员认识到他们编写的东西的复杂性很重要,尽管这有点微不足道。
  • @ShreevatsaR:嗯,它隐含地要求最小正确 big-O;任何更大的,虽然形式上是正确的,答案都不会被接受。在这种情况下,它可能会要求 Theta,但对于更复杂的情况,它通常没有定义(对于平均情况 big-O 与最坏情况 big-O 不同的任何情况,它都没有定义)。

标签: c++ data-structures time-complexity


【解决方案1】:

您的答案 1 是正确的,它位于仅由 n 控制的循环内。

答案 2 不正确。如果第 7 行不存在,O(log n),但是因为第 7 行强制第 8 行和第 9 行根据n 运行多次,所以答案是O(n log n)

答案 3 是正确的推理,但事实是答案 2 是错误的。 O(n) + O(n log n) 简化为 O(n log n)

所以答案是ADD

【讨论】:

  • @Annita:如果这个答案对你有帮助,你可以点击旁边的勾号“接受”它。
  • 该行下的cmets错误。 Big-O 只字不提时间。它指定了渐近复杂度,通常根据一些特定的操作。从这个意义上说,它更接近于“一段代码运行多少次”,而不是涉及运行时的任何事情(这也取决于诸如局部性之类的东西——big-O 总是假设任何给定操作都是恒定时间,其中因为内存访问因缓存而异)。
  • @James,括号中的“时间复杂度”清楚地表明我们在这里谈论的是时间。
  • @paxdiablo 除了 big-O 没有直接解决时间问题。您无法使用 big-O 分析时间问题。
  • 我相信这对于绝大多数确实使用它的人来说是个新闻 :-) 我同意它比大多数人意识到的要复杂得多,但是在上下文中这个问题,我相信我说的是对的。但是,为了安全起见,我会删除有问题的部分,特别是因为它与问题本身没有真正的关系。
【解决方案2】:

我不知道问题是如何制定的,但如果措辞像你说的那样,你的考官不知道大 O 的正确定义(至少在他期望“正确”答案时)——因为“大 O 功能包括更小”。因此,在 f(n) = 10 n 中作为 n 的函数执行的函数也在 O(n)、O(n^2)、O(n log n) 中。 如果有人要求尽可能“最小”,您的答案将是

  1. 语句 4 执行了 10 n 次,所以 A
  2. 语句 9 被执行 n*log n 次,所以 D
  3. 这里执行的是两者的总和,n + n*log n 所以(这里你丢失了一个 *n),所以 D 是正确的。

因此,如果可能有多个答案,并且只是询问执行了多少,那么正确的答案将是

  1. A,B,D
  2. B,D
  3. B,D

【讨论】:

  • 问题 2 中的 n 日志 n 答案是 D,而不是 C。
  • 是的已经修复了,误读了问题中的字母。
  • 我遇到的每一位导师和考官在谈论/询问某事的大 O 时总是含蓄地表示 最小正确 big-O,除非他们需要使用如果函数是 O(something) 而不是 O(something large) 的属性。
  • @Jan Hudec:对于非正式的谈话或一些辅导,这可能没问题,但对于考试来说,应该是精确的。并且定义很明确,我遇到的所有教授在他们的考试中都非常正确和准确,以使每个人都知道这个问题的含义。学生应该如何知道,老师也无意检查他是否知道 O(更大的东西)的 O(某物)子集 - 所以他所能依赖的只是问题的措辞并根据到定义。
【解决方案3】:

答案 1:A 即。 O(n) 因为语句 4 将被执行 10*n 次。

答案 2:死亡。 O(nlog(n)) 作为语句 9 将被执行 n*log(n) 次。

Ans 3: D 作为整体复杂度 [O(n) + O(nlog(n))] 将是 n*log(n)。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2018-08-02
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多