任何算法的时间复杂度都可能随着输入大小的增加而减少,任何一个例子

时间:2011-09-17 21:43:05

标签: performance algorithm complexity-theory big-o

我刚刚在Cormen的算法书中读到,大O和大欧米茄不遵循三分法属性。这意味着对于f(n)g(n)两个函数,可能是f(n) = O(g(n))f(n) = Omega(g(n))都不成立。在示例中,他们认为如果函数是n^(1+sin n)而不是可能。

虽然它是正确的,但在现实世界算法中,可能会有sin n之类的运行时间。因为随着输入大小的增加,它有时会减少。有没有人知道任何这样的算法,或者可以提供一个小代码片段来做到这一点。

感谢您的答案,所以在这种情况下假设给定一个大小为n的问题P,如果它不能通过任何已知算法在O(f(n))时间内求解,那么下限是正确的P是欧米茄(f(n))。

4 个答案:

答案 0 :(得分:15)

当搜索 的字符串变得更长时,Boyer-Moore字符串搜索算法变得更快。当然,限制因素通常是在中搜索的字符串的长度。

答案 1 :(得分:5)

随着条款与变量的比率增加,随机生成的3CNF条款的SAT平均运行时间最终会下降。直觉是当相对于变量数量有很多条款时,公式更可能“明显地”不可满足;也就是说,典型的SAT求解算法(比穷举搜索更好的一步或两步,但足够简单以涵盖本科逻辑课程)很快就会出现矛盾并停止。

当然,这些是对“随机”3CNF公式的一些概念的实验观察。我不确定人们已经证明了这一点。

答案 2 :(得分:3)

使用任何反函数。

f(x) -> 1 / x
f(x) -> 1 / x²
f(x) -> 1 / log(x)

随着输入x的增长,结果值将变小。将较小的值与算法中较少数量的步骤相关联是相当简单的。只需在循环中使用计数器即可移向该数字。

这是一个简单的算法。

function(x) {
    step = 0.001
    y = 1 / x;
    for (i = 0; i < y; i += step) { /* do something awesome here */ }
}

答案 3 :(得分:2)

我难以设想一个有意义的问题,降低复杂性。 “有意义”的问题需要阅读或触摸其所有输入的部分内容。除非输入以非常低效的方式编码,否则处理它应该花费越来越多的时间。

但是,它可能会朝着不变的方向增加。