【问题标题】:Polynomial time algorithms多项式时间算法
【发布时间】:2010-06-23 08:31:49
【问题描述】:

我曾经听过以下这句话,但忘记了它的作者:

在等待(多项式时间)算法停止时,不要忘记您的生命周期也受到多项式的限制。

有人可以提供参考吗?

我的另一个问题是:多项式时间算法很棒,但是在实践中使用需要O(n^101) 的算法的示例是什么,即以高次多项式为界?

【问题讨论】:

  • 欢迎来到 SO。一个问题,嗯,问题,请:)另外,代码格式应该用于代码;对于文本的引用,使用简单的>(我将要编辑)

标签: algorithm time-complexity


【解决方案1】:

好吧,我还没有看到 O(n^101),但是通过组合其他稍微低阶的算法来无意中创建高阶算法是很常见的。以我的经验,复杂性很少局限于一个变量,它更经常用多个变量来表示,例如O(A*log(B)log(C)(D^2)*(E-F))

例如,我最近的任务是开发一个algorithm to locate all potential sites for a pumped hydro electric power station for a given terrain model,其面积为 (X) x (Y) 米,由 (N) 个 3d 坐标组成。要求是在指定的最大水平距离 (H) 内找到指定最小面积 (A) 的平坦区域,并且另一个平坦的最小高度差 (Z) 具有指定的最小尺寸。在这种情况下,平坦度定义为必须移动以将该区域平整到任意标高 (E) 的材料体积,以垂直间隔 (V) 搜索。区域被定义为具有直径 (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) 并且显然需要更好的方法;)

由于需要在搜索中进行搜索,因此在这种情况下会出现复杂性。例如搜索地形中的平坦点,其中平坦点的定义本身需要非平凡的搜索,这反过来可能导致更多的搜索。有时这是不可避免的,会导致不希望的复杂程度。

在这里,抽象通常是您的敌人,其中一个迭代库例程迭代地使用另一个迭代库例程,而后者又在您自己的代码中迭代地使用。容器类的错误选择是一个常见的陷阱,尤其是当您遇到包含其他容器的容器时。

【讨论】:

    【解决方案2】:

    很可能任何复杂度为 O(n100) 的算法都实用,这就解释了为什么在实践中不使用此类算法。

    一个反复出现的高多项式算法问题是,如果您有大量对象(N 个对象)并且您需要根据给定的任意度量从集合中找到 k 个元素的“最佳”子集,或者找到具有特定属性的 k 个元素的子集。唯一始终适用的解决方案是枚举所有可能的子集。这会立即导致 O(Nk) 复杂度(其中 k 是固定的)。然而,对于大多数 N 值来说,k=100 的情况很难想象并且在实践中无法解决。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2013-04-17
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多