大O表示法隐藏了常数因子,因此存在一些算法,这些算法对于任何合理的输入大小都不可行,因为项的系数非常大。
是否存在任何已知的算法,其运行时间为但具有一些低阶项,其数量如此之大,以至于在合理的输入大小下,它完全主导了运行时间?我想在算法课程中使用像这样的算法作为示例,因为它提供了为什么不能使用big-O表示法的充分理由。
谢谢!
大O表示法隐藏了常数因子,因此存在一些算法,这些算法对于任何合理的输入大小都不可行,因为项的系数非常大。
是否存在任何已知的算法,其运行时间为但具有一些低阶项,其数量如此之大,以至于在合理的输入大小下,它完全主导了运行时间?我想在算法课程中使用像这样的算法作为示例,因为它提供了为什么不能使用big-O表示法的充分理由。
谢谢!
Answers:
如果是简并的,密码学就是一个例子。例如,打破AES加密是 -你所要做的就是找到其中有限数量的右键所有,2 128或2 192或2 256取决于密钥大小(假设明文足够众所周知,明确确定密钥)。但是,即使是2 128次操作,如今占用的所有计算机(大约十亿个左右,每个计算机每秒执行约十亿次操作)也要比整个宇宙的寿命(大约十亿亿秒)多。
用来说明为什么big-O不是全部的一种稍微不同的方式是说明我们有时对小输入量使用不同的算法。例如,进行快速排序。选择正确的支点(这是一项艰巨的任务!),它就是。Quicksort通过分而治之:每个实例都涉及对小型数组的大量排序。对于小型数组,二次方法(例如插入排序)的效果更好。因此,为了获得最佳性能,大型数组的快速排序涉及许多小尺寸插入排序的运行。
从参数化复杂度和FPT算法领域想到两个例子。这可能不完全是您要找的东西,但是可以了。
考虑一个图形问题,例如3-COLORING或HAM-CYCLE。这两个问题都可以用一元二阶逻辑表示,因此可以在具有受限树宽的图的线性时间中确定。这是Bruno Courcelle的结果,但所得算法远非实用。
另一个示例是Lenstra的深入研究结果,它说具有恒定数量变量的整数线性程序(ILP)可以在线性时间内求解。通过拉维·坎南(Ravi Kannan)的额外工作,我们可以使用算术运算来解决整数编程可行性问题,该算术运算的大小为O (p 2 p L )位的整数,其中p是数字ILP变量的总和,L是输入中的位数。这又产生了FPT算法,该算法仅适用于非常小的实例。
与您的问题有些相关的是从理论上讲性能良好的算法,但由于在较小的实例上不切实际,因此并未用于实际问题。换句话说,就像您要求的那样,“播发的性能”仅在理论上适用于大量输入,而在实际应用中则看不到。有时候,这可能会反映在Big-Oh的估算值中,而有时却不完全正确。一些算法具有良好的理论“性能”,但是逻辑上非常复杂,而且任何人都没有实现过,因此,甚至不知道实际实例大小的“性能”,例如最大流量问题。
请参见最新的最大流量算法是否实用?tcs.se
另请参阅功能强大的算法,太复杂而无法实现 tcs.se
银河算法 RJLipton博客
这是个玩笑,但它有严肃的一面...