我曾经听过以下一句话,但忘记了归因于谁:
在等待(多项式时间)算法停止时,不要忘记你的生命周期也受到多项式的限制。
有人可以提供参考吗?
我的另一个问题是:多项式时间算法很好,但是在实践中使用的算法的例子是什么,需要O(n^101)
,即以高次多项式为界?
答案 0 :(得分:2)
好吧,我还没有看到O(n ^ 101),但是通过组合其他稍低阶算法无意中创建高阶算法是很常见的。根据我的经验,复杂性很少局限于一个变量,它通常用多个变量表示,例如: O(A *日志(B)的日志(C)(d ^ 2)*(E-F))
作为一个例子,我最近的任务是开发一个algorithm to locate all potential sites for a pumped hydro electric power station for a given terrain model,其面积为(X)×(Y)米,由(N)3d坐标组成。要求是在指定的最大水平距离(H)内找到指定最小面积(A)的平坦区域,并且另一个平面的最小高度差(Z)具有规定的最小尺寸。此上下文中的平直度定义为在垂直间隔(V)搜索时必须移动以将区域平移到任意高程(E)的材料体积。区域被定义为具有直径(D)的(S)边的多边形,并且搜索分辨率以米(M)指定。蛮力的复杂性非常类似于此;
1)线性扫描初始平坦区域= O((X / M)*(Y / M)),该区域的高度范围为Z1至Z2 2)计算当前位置的平直度,计算单个体积O(S),搜索最小体积O的高度(((Z2-Z1)/ V)* S) 3)径向扫描靠近当前平坦区域的另一个平坦区域O(D / M),并计算新区域O的平坦度((Z3-Z4)/ V)* S)
结合这个我们得到O((X / M)(Y / M)((Z2-Z1)/ V) S (D / M)(H / M)((Z3-Z4)/ V)* S)显然需要更好的方法;)
由于必须在搜索中搜索,因此在这种情况下出现了复杂性。例如寻找地形中的平坦斑点,其中平坦斑点的定义本身需要非平凡的搜索,这反过来可能导致更多的搜索。有时这是不可避免的,导致不合理的复杂程度。
抽象通常可以成为你的敌人,其中一个迭代库例程迭代地使用另一个迭代库例程,而这个例程又在你自己的代码中迭代使用。容器类的错误选择在这里是常见的陷阱,特别是当您点击包含其他容器的容器时。
答案 1 :(得分:2)
很可能任何复杂度为O(n 100 )的算法都不实用,这就解释了为什么这些算法在实践中没有被使用。
一个反复出现的高多项式算法问题是,你有大量的对象(N个对象),你需要根据给定的任意度量从集合中找到k个元素的“最佳”子集,或者找到具有特定属性的k个元素的子集。唯一始终适用的解决方案是枚举所有可能的子集。这直接导致O(N k )复杂度(其中k是固定的)。然而,k = 100的情况很难想象,并且在实践中对于大多数N值都无法解决。