【问题标题】:Robot moving in a grid algorithm possible paths and time complexity ?机器人在网格算法中移动的可能路径和时间复杂度 ?
【发布时间】:2013-06-20 07:04:04
【问题描述】:

我无法理解为什么路径数为 (x+y)!/x!y! ..我知道它来自从 X+Y 项目的路径中选择 X 项目,但为什么不选择 x 项目而不是 x+y + 选择 y 项目而不是 x+y ?为什么它必须只有 x ?

机器人位于 m x n 网格的左上角(标记为 下图中的“开始”)。机器人只能向下或向下移动 就在任何时间点。机器人试图到达 网格的右下角(图中标记为“完成” 以下)。有多少种可能的路径?

  1. 所有这些路径都是唯一的吗?
  2. 如何确定?
  3. 回溯算法的时间复杂度是多少?

【问题讨论】:

  • 由于加法和乘法都是可交换的,(x+y)!/x!y! 与(y+x)!/y!x! 相同。因此,我不明白你为什么说它是“只有 x”。
  • 不应该是 (x+y)!/x!y! + (y+x)!/y!x!因为我们同时选择 x 和 y ?为什么我们只需要考虑一个?
  • 正如我所说,这两个表达式产生完全相同的结果。您对提案所做的所有事情实际上都是将结果乘以 2。我不明白为什么您认为 x 在原始表达式中以某种方式“被考虑”,而 y 在某种程度上被“忽略”。跨度>

标签: algorithm


【解决方案1】:

这有点基于Mukul Joshi's answer,但希望更清楚一点。

要从0,0 移动到x,y,您需要准确地向右移动x 次并准确地向下移动y 次。

让每个向右运动由0 表示,向下运动由1 表示。

让0s 和1s 的字符串表示从0,0 到x,y 的路径。该路径将包含x0s 和y1s。

现在我们要计算所有这些字符串。这相当于计算包含x0s 和y1s 的任何字符串的排列数。这个字符串是一个多重集(每个元素可以出现多次),因此我们想要一个multiset permutation,可以计算为n!/(m1!m2!...mk!),其中n是字符总数,k是唯一字符数字符和mi 是重复ith 唯一字符的次数。由于共有x+y个字符,并且0重复x次和1重复y次,我们得到(x+y)!/x!y!。

时间复杂度:

回溯/蛮力的时间复杂度将涉及必须探索所有这些路径。把它想象成一棵树,有(x+y)!/x!y! 叶子。我可能错了,但我认为具有分支因子> 1 的树中的节点数可以表示为叶子数的大 O,因此我们最终得到 O((x+y)!/x!y!) 节点,因此同时复杂性。

【讨论】:

    【解决方案2】:

    好的,我给你一个解决这个问题的方法,这样你就有更好的时间去解决它。
    首先,让我们决定一个解决算法。我们将计算每个细胞从它到达终点的所有可能路径。该算法将检查单元格并在那里写入右侧和底部单元格的总和。我们这样做是因为机器人可以向下移动并遵循任何底部路径或向右移动并遵循任何右侧路径,从而增加不同路径的总数。对我来说,证明这些路径的多样性是很明显的。如果你愿意,我可以在 cmets 中完成。
    对于最右边的底部单元格(完成),单元格的初始值将是 1,因为从该单元格只有一种方法可以到达那里(根本不移动)。如果单元格不存在(例如,将底部单元格作为最底部的单元格),则其值为 0。
    一个一个地构建单元格值将在 (x, y) 单元格中生成 Pascal's Triangle,其中的值是 (x + y)! / x! / y!,其中 x 是距终点的 Ox 距离,y 是 Oy 1。

    谈到复杂性,我们将在网格单元上进行x * y 迭代,每次迭代都是一个常数时间。如果您不想使用回溯算法,您可以使用上面提到的公式并使用 O(x + y) 而不是 O(x * y)

    【讨论】:

    • 哈哈,看看我在那个 wiki 页面上发现了什么:Pascal 的三角形覆盖在网格上,给出了每个正方形的唯一路径数,假设只考虑向右和向下移动。
    • 是的,那是一样的..说帕斯卡三角表示为二维矩阵:1 1 1 1 2 1 1 3 3 1 1 4 6 4 1等等..然后pascalTriangle[i][ j]= iCj(从 i 项中选择 j 项的方式。)
    【解决方案3】:

    这里是解释。

    无论你怎么走,要到达目的地,路径必须有 m 行和 n 列。

    假设你用 1 表示行,用 0 表示列。你的路径是一个 m+n 个字符的字符串。但它只能有 m 个 1 和 n 个 0。

    如果你有 m+n 个不同的字符,排列的数量将是 (m+n)!但是当你有重复的字符时,它将是 (m+n)!/m!n!参考this

    当然,这将是独一无二的。测试它的 4*3 网格,你可以看到它。

    【讨论】:

      【解决方案4】:

      您没有添加“我可以通过多少种方式分配我的 X 招式?”到“我有多少种方式可以分配我的 Y 移动?”有两个原因:

      1. X 移动和 Y 移动的分布不是独立的。对于 X 移动的每种配置,Y 移动只有 1 种可能的配置。
      2. 如果它们是独立的,您不会将它们相加,而是将它们相乘。例如,如果我有 X 件不同颜色的衬衫和 Y 件不同颜色的裤子,那么衬衫和裤子就有 X * Y 种不同的组合。

      请注意,对于 #1,X 没有什么特别之处 - 我可以很容易地选择 Y 并说:“Y 动作和 X 动作的分布不是独立的。对于 Y 动作的每个配置,只有 1 个可能X动作的配置。”这就是为什么,正如其他人所指出的,计算分配 Y 动作的方式的数量与计算分配 X 动作的方式的数量相同。

      【讨论】:

        猜你喜欢
        • 2017-11-05
        • 2021-03-11
        • 2019-03-07
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 2021-01-23
        • 1970-01-01
        相关资源
        最近更新 更多