有没有O(1 / n)算法? 算法
或者其余任何小于O(1)的东西? less
inline void O0Algorithm() {}
这是一个简单的O(1 / n)算法。 它甚至作了一些有趣的事情! dom
function foo(list input) { int m; double output; m = (1/ input.size) * max_value; output = 0; for (int i = 0; i < m; i++) output+= random(0,1); return output; }
O(1 / n)是可能的,由于它描述了在增长输入大小的状况下函数输出如何变化。 若是咱们使用函数1 / n来描述函数执行的指令数,则不要求函数对任何输入大小采用零指令。 相反,对于每一个输入大小,n高于某个阈值,所需的指令数量高于正常数乘以1 / n。 因为没有实际数字,其中1 / n为0,而且常数为正,所以没有理由将该函数约束为采用0或更少的指令。 函数
在数值分析中,近似算法在近似容差中应具备亚常数渐近复杂度。 this
class Function { public double[] ApproximateSolution(double tolerance) { // if this isn't sub-constant on the parameter, it's rather useless } }
正如已经指出的,除了null函数可能的例外以外,不能有O(1/n)
函数,由于所花费的时间必须接近0。 spa
固然,有一些算法,好比Konrad定义的算法,看起来它们至少在某种程度上应该小于O(1)
。 code
def get_faster(list): how_long = 1/len(list) sleep(how_long)
若是您想研究这些算法,您应该定义本身的渐近测量,或者您本身的时间概念。 例如,在上面的算法中,我能够容许使用必定次数的“自由”操做。 在上面的算法中,若是我经过排除除睡眠以外的全部时间来定义t',那么t'= 1 / n,即O(1 / n)。 可能有更好的例子,由于渐近行为是微不足道的。 事实上,我确信那里的某我的能够想出能给出非平凡结果的感官。 get
不少人都有正确的答案(不)这是证实它的另外一种方式:为了拥有一个功能,你必须调用该功能,你必须返回一个答案。 这须要必定的时间。 即便其他的处理花费更少的时间来处理更大的输入,打印答案(咱们能够假设是一个单位)至少须要一个恒定的时间。 input