如何为这个问题实现这个O(1)算法?

时间:2011-08-10 08:29:24

标签: performance algorithm big-o

我有变量x,函数f1(x),f2(x),... fn(x)(n最多可达1百万)。这些函数的值是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)算法吗?谢谢!

6 个答案:

答案 0 :(得分:14)

除非你比你告诉我们更多地了解这些功能,否则就不会有O(1)算法。你必须至少查看一次每个函数的输出,这个问题的每个算法都以Ω(n)运行。

答案 1 :(得分:10)

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

答案 2 :(得分:4)

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

修改

由于我对此有一些贬低,我试图澄清推理。鉴于手头的信息,没有比评估所有f更快的方法来解决这个问题。如果问题确实是“有没有更快/更聪明的方法来做到这一点?”那么答案是(尽可能多的回答)没有。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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