在算法中,我们通常会见到时间复杂度为O(n), O(n*log n), O(2n)
等。但是,在实践中是否存在时间复杂度为O(n/log n), O(2^n/P(n))
(其中P(n)
是n的多项式)的算法呢?如果是这样,请问有没有示例?如果不是,那么为什么在实践中很少出现这些时间复杂度呢?谢谢。
在算法中,我们通常会见到时间复杂度为O(n), O(n*log n), O(2n)
等。但是,在实践中是否存在时间复杂度为O(n/log n), O(2^n/P(n))
(其中P(n)
是n的多项式)的算法呢?如果是这样,请问有没有示例?如果不是,那么为什么在实践中很少出现这些时间复杂度呢?谢谢。
在某些情况下,实际上确实会看到像O(n2 / log n)这样的运行时间。有一系列通常称为“四路归并算法”的技术可用于加速某些类型的算法。通常,四路归并技巧通过在所有大小为Θ(log n)的输入上强制计算问题的解决方案,然后将大小为n或n2的原始输入重新构造为 O(n / log n) 或 O(n2 / log n) 块,每个块都是大小为Θ(log n)的子问题。这些算法的运行时间通常是一些多项式除以一些对数多项式项,其中对数多项式的加速来自于原始问题大小已经缩小了对数多项式因子。
例如,用于计算长度为n的两个字符串的编辑距离的标准DP算法的运行时间为O(n2)。使用类似Four-Russians的加速技巧,这可以优化到O(n2/log2n)。布尔矩阵乘法通常需要O(n3)的时间,使用原始的Four-Russians技巧可以将其优化到O(n3/log n)。