【问题标题】:How to implement this O(1) algorithm for this question?如何为这个问题实现这个 O(1) 算法?
【发布时间】:2011-08-10 08:29:23
【问题描述】:

我有变量 x,函数 f1(x), f2(x), .... fn(x)(n 可以达到 100 万)。这些函数的值是 1 或 0。那么,如何编写算法,可以快速提取返回 1 的函数呢?谢谢。

我在这里介绍我的。它的时间复杂度为 O(n),效率不够。

List funHaveTrueValues = new ArrayList();

for (int i=1; i<=n; ++i){
 if (fi(x)==true){
   funHaveTrueValues.add(fi);
  }
 }
}

有人可以提出 O(1) 算法吗?谢谢!

【问题讨论】:

  • 是什么让您认为存在 O(1) 方法?
  • 如果只有 n 个函数,为什么要迭代 n+1 的范围?
  • 输入是什么?这可能只是文字游戏,但如果您输入的是x,并且您的函数f1...fn 被认为是输入的一部分,那么您的算法对于所有和每个x 都是O(1),如果fi 对于所有X 都是恒定的.
  • 使用具有 n 个处理器的并行机器。根据给定的信息,您必须检查所有 n 个函数。

标签: performance algorithm big-o


【解决方案1】:

除非你对函数的了解比你告诉我们的多一点,否则不可能有一个 O(1) 算法。您必须至少查看每个函数的输出一次,使该问题的每个算法都在 Ω(n) 中运行。

【讨论】:

  • 我想我可能不得不使用多线程并行计算所有函数的值,然后选择返回真值的函数。
  • 要使用 n 个线程,您必须启动 n 个线程,这需要 O(n) 个步骤!
  • @kan Nitpick:您可以启动两个线程,并让每个线程启动两个线程,依此类推,每个线程的 O(log n) 步骤。 ;)
【解决方案2】:

Grover's Algorithm 可以在 O(sqrt(n)) 中完成,但它需要一台量子计算机。

【讨论】:

  • 即使您购买了量子计算机,也不能保证该算法能够为您提供正确的结果...
【解决方案3】:

如果您可以假设每个fO(1),那么对它们进行最多1.000.000 次调用仍然有一个恒定的上限。因此,如果您将其限制为 1.000.000 次调用,我相信您的草图方法是 O(1)

编辑

由于我对此有一些反对意见,因此我试图澄清其中的原因。鉴于手头的信息,没有比评估所有f 更快的方法来解决这个问题。如果问题真的是“是否有更快/更聪明的方法来做到这一点?”那么答案是(正如许多人回答的那样)没有。

如果问题的风格是“我在复杂性理论测试中得到了这个问题”(或类似的),那么它可能是一个“陷阱!”。这就是我的答案所针对的情况。在广义问题(使用n 函数,没有限制)中,时间复杂度为O(n),允许每个函数的行为类似于O(1)oracle。通过引入 1.000.000 个函数的屋顶,时间复杂度得到一个恒定的上限 O(1000000 * 1) = O(1)

【讨论】:

  • 这太荒谬了。我有一个 O(N!) 算法,但是因为我在 32 位机器上运行它,所以我的算法实际上仅限于 N
  • +1 来自我:我正要更新我的答案以提出这个建议!
  • 哦,来吧,你做了渐近分析,依赖一个变量(这里:N)。在 N 中,算法是 O(N)。如果您限制 N,您的程序将在 O(1) 内完成,但这不会改变算法本身是 O(N) 的事实。你说的是任何东西(不是无限循环)在 PC 上都是 O(1),因为基本类型是有限的,如果不是,那么内存是有限的。
  • @yi_H:是的,在一般情况下(出于实际目的)你是正确的 - 如果 OP 没有说明上限,我不会回答这个问题。我们不知道这个问题是实用的还是复杂的技术问题。
  • +1 表示对愚蠢问题的愚蠢回答 :-) 这是实现提问者期望的 O(1) 的唯一方法(嗯,与其说是“实现”不如说是“狡猾的措辞” "),所以如果答案是不可接受的,那只是因为这个问题是不可能的。为提问者提供不准确地讨论术语的权利 - 因为 n 在问题中是有界的,所以 O(n) 并不意味着提问者认为它的意思。
【解决方案4】:

如果 x 确实发生了变化,您无论如何都需要评估每个函数,所以它仍然是 O(n)。但是,您可能会确定哪个 x 的结果可能是 0 或 1(如果可能得到类似:x &lt;= y always results in 0, x &gt; y is always 1)并存储这些阈值。然后,您只需评估一次函数,然后只需根据计算的阈值检查 x。请注意,这在很大程度上取决于您的 fn(x) 的实际作用。

因此,像 O(1) 这样的事情的关键可能是缓存,只要 fn(x) 结果可以通过合理的努力进行缓存。

【讨论】:

    【解决方案5】:

    您必须对每个函数至少评估一次,并且有 n 函数。因此,您不能比O(n) 做得更好(当然,除非您预先计算所有可能输入的输出并将其存储在表中!)。

    【讨论】:

      【解决方案6】:

      这是不可能的,无论如何你必须为所有 n 个元素运行你的函数,这意味着 n 个函数

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2019-10-08
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多