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

Performance 如何实现这个问题的O(1)算法?,performance,algorithm,big-o,Performance,Algorithm,Big O,我有变量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); } } } List funHaveT

我有变量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);
  }
 }
}
List funHaveTrueValues=new ArrayList();

对于(int i=1;i除非你对函数的了解比你告诉我们的要多,否则不可能有O(1)算法。你必须至少查看每个函数的输出一次,使这个问题的每个算法都以Ω(n)运行.

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

有一个函数在O中执行它(sqrt(n))但是它需要一台量子计算机。

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

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

编辑

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


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

如果x确实发生了变化,您需要对每个函数进行求值,因此它仍然是O(n)。但是,您可以确定x的结果可能是0还是1(如果有可能得到如下信息:
xy始终为1
)并存储这些阈值。然后只需对函数求值一次,然后根据计算出的阈值检查x。请注意,这在很大程度上取决于fn(x)的实际功能


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

什么让你认为存在O(1)方法?如果只有n个函数,为什么要在n+1的范围内迭代?输入是什么?这可能只是文字游戏,但如果输入是
x
,并且函数
f1…fn
被视为输入的一部分,则算法是O(1)对于所有和每个
x
如果
fi
对于所有x都是常数。使用具有n个处理器的并行机。根据给定的信息,您必须检查所有n个函数。即使您购买了量子计算机,此算法也不能保证给您正确的结果……我想我可能不得不使用多线程来计算他并行计算所有函数的值,然后选择返回真值的函数。要使用n个线程,你必须启动n个线程,这需要O(n)个步骤!@kan Nitpick:你可以启动两个线程,让每个线程都启动两个线程,以此类推,每个线程都有O(logn)个步骤。;)这太荒谬了。我有一个O(n!)算法但因为我在32位机器上运行,我的算法实际上被限制在N+1:我正要更新我的答案来提出这个建议!哦,来吧,你做依赖于变量的渐近分析(这里是:N)。在N中,算法是O(N)。如果你限制N,你的程序将在O(1)中完成,但这并没有改变algo本身是O(N)的事实。你所说的是任何东西(不是无限循环)在PC上都是O(1),因为基本类型是有限的,如果不是,那么内存是有限的。@yi_H:是的,在一般情况下(出于实际目的)你是对的-如果OP没有说明上限,我就不会回答这个问题。我们不知道这个问题是否实用或是否涉及复杂的技术细节。+1对于一个愚蠢问题的愚蠢回答:-)这是提问者想要的O(1)能够实现的唯一方式(好吧,与其说“实现”不如说“黄鼠狼语”),因此,如果答案是不可接受的,那只是因为这个问题是不可能的。因为n在问题中是有界的,所以O(n)并不是发问者认为它的意思。