Performance 任何算法的时间复杂度是否可能随着输入大小的增加而降低

Performance 任何算法的时间复杂度是否可能随着输入大小的增加而降低,performance,algorithm,complexity-theory,big-o,Performance,Algorithm,Complexity Theory,Big O,我刚刚在Cormen的算法书中读到big-O和big-omega不遵循三分法性质。这意味着对于两个函数,f(n)和g(n),可能是f(n)=O(g(n))和f(n)=Omega(g(n))都不成立的情况。在这个例子中,他们认为如果函数是n^(1+sinn),那么它是可能的 虽然这是正确的,但在现实世界的算法中,是否可能有类似于sinn的运行时。因为它有时会随着输入大小的增加而减少。有没有人知道这样的算法,或者可以给出一个小的代码片段来实现这一点 感谢您的回答,因此在这种情况下,假设给定一个大小为

我刚刚在Cormen的算法书中读到big-O和big-omega不遵循三分法性质。这意味着对于两个函数,
f(n)
g(n)
,可能是
f(n)=O(g(n))
f(n)=Omega(g(n))
都不成立的情况。在这个例子中,他们认为如果函数是
n^(1+sinn)
,那么它是可能的

虽然这是正确的,但在现实世界的算法中,是否可能有类似于
sinn
的运行时。因为它有时会随着输入大小的增加而减少。有没有人知道这样的算法,或者可以给出一个小的代码片段来实现这一点


感谢您的回答,因此在这种情况下,假设给定一个大小为n的问题p,如果任何已知算法都无法在O(f(n))时间内解决它,那么p的下界是ω(f(n))。

使用任何反函数

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 */ }
}
函数(x){
阶跃=0.001
y=1/x;
对于(i=0;i
当搜索的字符串变长时,Boyer-Moore字符串搜索算法会变得更快。当然,限制因素通常是搜索到的字符串的长度。

随机生成的3CNF子句的SAT平均运行时间最终会随着子句与变量的比率的增加而减少。直觉是,当与变量数量相关的子句非常多时,公式“显然”不可满足的可能性更大;也就是说,典型的SAT求解算法(比穷举搜索好一两步,但足够简单,可以在本科逻辑课程中涵盖)很快就会遇到矛盾并停止


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

我很难想象出一个复杂度降低的有意义的问题。一个“有意义的”问题将需要读取或触摸其所有输入的一部分。除非以非常低效的方式对输入进行编码,否则处理它将花费越来越多的时间


但是,它可能会朝着一个常数增加。

很容易构造出具有这种奇怪运行时的函数的人为示例,但据我所知,没有函数的渐近运行时会随着输入的增大而减少。是的,正如templatetypedef所说,它们通常是人为的例子,也有人为的例子,这些函数的运行时会减少,但它们对任何人都没有真正的用处,除非可以这样做:\可能更好SE?通过一个人为的例子,某些函数可以像sin(x)那样增减。然而,由于算法的复杂性,它不能具有递减函数。随着输入的增加,算法中的步数将减少,但不能将其减少到0以下。所以最终它将是一个常数,算法必须具有恒定的复杂性。其他人在他们的示例中建议使用好的函数,但我不知道为什么你认为
sin(x)
不是一个真正的算法函数,当然你有时会在代码中使用它,看到它背后的实现也很好。真的不明白,如何获得你提到的任何一个f(x)作为算法的运行时?我添加了一个简单的函数来关联输入值和算法完成所需的步骤数。但这些不是O(1/x)。它们是O(1)。你将不可避免地遇到离散问题。@Jems,@phkahler-当我们使用渐近时间复杂性时,我们对收敛值不感兴趣。否则,所有算法都将是
O(∞)n
收敛到
,任何依赖于
n
的算法,例如
O(n)
O(n³)
所采取的步骤数将简单地收敛到
。因此,可以说上述算法的复杂性是
O(1/n)
。就离散性而言,可以选择适当的步进值,而不是使用固定的步进值,例如
0.001
@Anurag。如果您的算法总是运行至少一步,那么它已经是ω(1)。另一种选择是零步算法。有趣的答案!你是否将分析子句所需的时间包括在运行时间中?从理论角度来看,这很重要,因为即使发现矛盾所需的时间减少,分析所需的时间也应该是超出某一点的主要成本。对,生成ng(或解析)公式在子句数量(乘以变量数量的对数,如果你真的想精确的话)上是线性的。一个“有意义的”问题将需要读取或接触其所有输入的一部分。二进制搜索只需要平均读取其输入的对数量。