【问题标题】:Is there such a thing as "negative" big-O complexity? [duplicate]是否存在“负”大 O 复杂度之类的东西? [复制]
【发布时间】:2010-07-09 01:53:48
【问题描述】:

可能重复:
Are there any O(1/n) algorithms?

这只是突然出现在我的脑海中,没有什么特别的原因,我想这是一个奇怪的问题。是否有任何已知的算法或问题实际上可以更容易更快通过更大的输入来解决?我猜如果有的话,它不会用于突变或排序之类的事情,而是用于决策问题。也许有一些问题,有大量的输入可以很容易地做出决定,但我无法想象会是什么。

如果不存在负复杂性这样的东西,是否有证据证明不存在?还是只是还没有人发现?

【问题讨论】:

  • 这不会是“负数”,而是指数(或其他)衰减。例如 O(n^-1)。
  • 有可能(尽管不太可能是 IMO)某种奇怪的量子纠缠效应可能导致计算机在接收到输入之前输出其结果。这算负复杂性吗??
  • 他们应该给我们这个帖子的新徽章。像“时间旅行者”这样的东西会很好……哈哈。 =]
  • 它只是 O(1)。投票打开一个最有趣的问题列表。
  • 感谢您对逆复杂度的更正。当我说否定时,我非常愚蠢。我在这里被取笑了吗?

标签: algorithm complexity-theory big-o


【解决方案1】:

不,那是不可能的。由于 Big-Oh 被认为是算法执行与其域大小相关的操作数的近似值,因此将算法描述为使用负数的操作是没有意义的。

维基百科article 的正式定义部分实际上使用正实数定义了 Big-Oh 符号。所以实际上甚至没有证据,因为根据正式定义,Big-Oh 的整个概念对负实数没有任何意义。

简答:不可能,因为定义是这样说的。

【讨论】:

    【解决方案2】:

    更新 为了清楚起见,我正在回答这部分问题:是否有任何已知的算法或问题实际上可以通过更大的输入变得更容易或更快地解决?

    正如此处接受的答案所述,没有算法在更大的输入下工作得更快。 Are there any O(1/n) algorithms? 即使像sleep(1/n) 这样的算法也必须花时间读取其输入,因此它的运行时间有一个下限。

    特别是作者参考了比较简单的子串搜索算法:
    http://en.wikipedia.org/wiki/Horspool

    PS 但是在我看来,对此类算法使用“负复杂性”一词似乎并不合理。

    【讨论】:

    • 作为接受的答案最终承认,没有 O(1/n) 算法。运行时间可以减少到某个有限的 n,但渐近地说,它不可能是 o(1)。
    • 但即使在这里 O(1/n) 也不是负数。别介意正式定义将 Big-Oh 限制为积极的事实。
    • @ShreevatsaR 你为什么要告诉我这个?在我的帖子中,我并没有声称这些算法是 O(anything)。
    • 我在 wiki 页面上找不到 anything 声称它比 O(n) 更好,并且您链接到的答案非常清楚:“请注意,这些算法不会表现出低于 O(1)" 的运行时行为。
    • 我要指出的是,没有任何算法可以在更大的输入下始终变得更快。可以达到一定的输入大小。
    【解决方案3】:

    考虑一个在负时间执行的算法,与考虑时间倒退是一样的。

    如果程序在上午 10:30 开始执行并在上午 10:00 停止而没有经过上午 11:00,则它刚刚执行,时间 = O(-1)。

    =]

    现在,对于数学部分:

    如果你不能想出一系列及时执行的动作(你永远不知道......哈哈),证明很简单:

    positiveTime = O(-1) 表示:

    positiveTime 0 和 n > n0 > 0

    考虑“C > 0”限制。 我们找不到一个正数乘以 -1 会得到另一个正数。 考虑到这一点,结果如下:

    positiveTime n0 > 0

    这只是证明你不可能有一个 O(-1) 的算法。

    【讨论】:

      【解决方案4】:

      不是真的。 O(1) 是您所希望的最好结果。

      我能想到的最接近的是语言翻译,它使用目标语言中的大型短语数据集来匹配源语言中较小的 sn-ps。数据集越大,翻译越好(并且在一定程度上更快)。但这还不是 O(1)。

      【讨论】:

      • 我也认为那是错误的“n”。 n不是sn-ps的数量吗?您正在翻译它们,而不是数据集,这会给您 O(n) 或更糟的结果。
      • 一个真正让人们头晕目眩的......是O(1)还是O(0)?
      • @BrianGideon 我认为这取决于(取决于案例和您的定义)。如果在 noop 之前您有一个命令需要在执行下一个命令之前等待 1 个时钟(因此您必须在它们之间放置 noop),那么您可以争辩说读取和执行 noop 所需的时间实际上是一部分上一个(或下一个)命令的时间(但这取决于您对命令时间的定义),在这种情况下,您可以说它是 O(0),因为它不会为程序添加任何时间。但是,如果您添加一个不必要的 noop,它会增加程序的时间并花费 O(1)。
      【解决方案5】:

      嗯,对于像“给定输入 A 返回 f(A)”这样的许多计算,您可以“缓存”计算结果(将它们存储在数组或映射中),如果其中一些值的话,这将使计算更快地处理更多的值值重复。

      但我认为它不属于“负复杂性”。在这种情况下,最快的性能可能算作 O(1),最坏情况下的性能是 O(N),平均性能介于两者之间。

      这在某种程度上适用于排序算法 - 其中一些具有 O(N) 最佳情况复杂度和 O(N^2) 最坏情况复杂度,具体取决于待处理的数据状态排序。

      我认为要具有负复杂性,算法应该在被要求计算结果之前返回结果。 IE。它应该连接到时间机器,并且应该能够处理相应的"grandfather paradox"

      【讨论】:

      • 这种类型的编程实际上有一个名称,即在开始之前完成的程序。我希望我能记住那个名字是什么!
      【解决方案6】:

      与其他关于空算法的问题一样,这个问题是一个定义问题,而不是什么可能或不可能的问题。当然可以考虑一个算法花费 O(1/n) 时间的成本模型。 (这当然不是负数,而是随着输入的增加而减少。)该算法可以执行类似sleep(1/n) 的操作,这是建议的其他答案之一。确实,当 n 被发送到无穷大时,成本模型会崩溃,但 n 永远不会被发送到无穷大;无论如何,每种成本模型最终都会崩溃。对于从 1 字节到 1 GB 的输入大小,说 sleep(1/n) 花费 O(1/n) 时间可能是非常合理的。这是适用于任何时间复杂度公式的非常广泛的范围。

      另一方面,时间复杂度的最简单、最标准的定义使用单位时间步长。正整数值函数不可能具有递减渐近性;最小的可能是 O(1)。

      【讨论】:

        【解决方案7】:

        我不知道这是否很合适,但它让我想起了 bittorrent。下载文件的人越多,所有人的下载速度就越快

        【讨论】:

          猜你喜欢
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          • 2021-05-13
          • 2019-07-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多