【问题标题】:Big-O time complexity大O时间复杂度
【发布时间】:2010-10-25 08:19:53
【问题描述】:

我一直在自学 Big-O。我了解如何为算法提供以下符号的示例:

O(N):

for(int i = 0; i < n; i++)
    sum++;

O(N^2):

for(int i = 0; i < n; i++)
    for( int j = 0; j < n; j++)
        sum++;

O(N^3):

for(int i = 0; i < n; i++)
    for( int j = 0; j < n * n; j++)
        sum++;

我遇到了这些我不太理解的符号。我如何在算法方面给出这些例子?

也许我应该这样说:编写一个算法,它的运行时间与以下成比例:

  1. O((n^3)/4)
  2. 记录 n^3
  3. O((log^2)n)+O(n)
  4. 4^n
  5. n^3/2

【问题讨论】:

  • 问题通常是如何找到特定算法的大 O,
  • 这些是 O() 算法的示例。有无数种算法适合任何大 O。请查看 @KMan 的链接。
  • 顺便说一句:O(log^2n)+O(n) 没有意义。 O 是一个符号,而不是一个函数,所以你不能添加它。另外,“log^2n”应该是什么意思?
  • 对不起,我编辑了一些错别字。我在dreamincode.net/forums/topic/125427-determining-big-o-notation 上查看了一些示例,我能够研究一些源自符号的示例,即logN。我想知道我是否也可以从给定的符号中得出例子?我也在查看他的 logN 代码: for(int i = 0; i

标签: java big-o time-complexity


【解决方案1】:

我担心你误解了“Big-O”符号。

符号不是作为算法“表达”的。相反,Big-O 表示法描述算法的属性。

所以不是“O(N) 可以表示为 XXX”,而是“算法 XXX 的复杂度为 O(N)”。

也就是说,要求具有一定复杂性的算法示例是很合理的; 你已经列出了一些。解决您的问题:

O(4^n) 与 O(e^n) 相同,常写为 O(exp(n))(尝试理解为什么相同)。 O( 4^n) 属于具有“指数复杂度”的算法类别 (EXPTIME)。数学/CS 中的许多重要问题都具有指数复杂度(或接近指数复杂度)。

具有指数复杂度的算法例如是discrete logarithm problem 的简单解决方案。

对于其他复杂性,我无法举例,但您可能会通过谷歌搜索找到一个。

【讨论】:

  • 我不买你的 O(a^n) = O(b^n) 和 a,b>1。虽然在处理对数时基确实无关紧要,但这不适用于指数函数。否则,整个 EXPTIME 类将是一组 O(2^n)(或更方便地为 O((1+epsilon)^n))算法的问题。
  • @bitmask:实际上是这样。维基百科,例如将 EXPTIME 定义为“确定性图灵机在 O(2^p(n)) 时间内可解决的所有决策问题的集合”(其中 p(n) 是 n 中的多项式)。
  • 顺便说一句,我原来的陈述“O(4^n) 与 O(e^n) 相同”当然是错误的。我的想法(但非常模糊)是它们都在 EXPTIME 中。谢谢你提醒我:-)。
  • 是的,那是不同的东西。 O(2^p(n)) 包含所有 O(a^n),因为您可以在 p 中隐藏不同的基数 (a)。例如,如果 p(n)=2n,那么你有 2^(p(n)) = 4^n。但这并不意味着 O(2^n) = O(4^n)。
【解决方案2】:

您给出的算法严格来说不是 Big-O,而是 Theta。 Big-O 是一个渐近上界,这意味着在某些更坏的情况下,运行时间将是给定的,但并非针对所有输入,因为 Theta 是一个紧界,意味着运行时间将始终如此。例如,考虑一个排序算法,它以一个已经排序的列表作为输入,或者一个搜索算法,其中要找到的东西是列表中的第一个元素(在这种情况下,二进制搜索与线性搜索相比如何)。

【讨论】:

  • 如果我们要挑剔的话。 Theta(f(N)) 的任何算法也是 O(f(N))。所以 OP 说他们是 Big-O 是正确的
  • ???这些都是Big-O Omega,暗示Theta。 “意思是在一些更糟糕的情况下输入”。 Theta 只是更具体,下限也已被发现/证明。它与最坏的情况无关。 “运行时间永远是那个”严格来说是不正确的,最好是“速率的增长与 Theta 成正比”。
猜你喜欢
  • 2018-07-08
  • 2014-05-29
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多