困难算法:1的最优解

时间:2012-09-21 13:47:31

标签: algorithm

这是那些困难的算法之一,因为有很多选择。想象一个数字' N'和一组10岁以下的素数,即{2,3,5,7}。目标是保持N分,直到达到1.如果在任何步骤N不能被任何给定的素数整除,那么你可以进行以下操作:

i)N = N-1 或ii)N = N + 1

这将确保N是偶数,我们可以继续。

应该在使用最少数量的操作时实现目标。

请注意,这可能听起来微不足道,即你可以在你的算法中实现一个步骤,如果N可以被任何素数整除,那么将它除去"。但这并不总能产生最佳解决方案

E.g。如果N = 134:现在134可以除以2.如果除以2,则得到67. 67不能被任何素数整除,所以你做一个操作,N将是66/68,这两个都需要另一个操作。总共2次操作。

或者,如果N = 134并且您进行操作N = N + 1,即N = 135,在这种情况下,达到1所需的总操作是1.因此这是最佳解决方案

1 个答案:

答案 0 :(得分:2)

除非针对此问题有一些数学解决方案(如果您正在寻找数学解决方案,math.SE更适合此问题) - 您可以将问题减少到shortest path problem < /强>

将问题表示为图G=(V,E),其中V = N(所有自然数)和E = {(u,v) | you can get from u to v in a single step } 1

现在,您需要从源(输入数字)到目标(数字1)运行经典搜索算法。获得最佳解决方案的一些选择是:

  1. BFS - 由于简化图未加权,因此保证BFS完全(找到解决方案,如果存在)和最优(找到最短的解决方案)。
  2. 启发式A* - 这也是完整且最优的 2 ,如果你有一个好的启发式功能 - 应该比一个不知情的BFS更快。
  3. 优化备注:
    图形可以“动态”构建,无需将其创建为预处理。为此,您需要next:V->2^V(从节点到一组节点)功能,以便next(v) = {u | (v,u) is in E}

    PS 复杂性评论:BFS解决方案是伪多项式(在最坏情况下输入数字是线性的),因为您将开发的“最高”顶点是n+1,所以解决方案基本上是O(n)最坏的情况 - 尽管我认为更深入的分析可以将其限制在更好的限制。


    (1)如果您只对+ 1 / -1感兴趣被视为操作,则可以在完成分割后根据目标创建边。
    (2)如果使用admissible heuristic function