Algorithm 获取i';不计算其他前缀的th前缀

Algorithm 获取i';不计算其他前缀的th前缀,algorithm,math,permutation,Algorithm,Math,Permutation,我读过这篇文章,它非常接近我的问题,但不能概括它。 我试图通过使用多个CPU搜索所有路径来解决旅行销售人员的问题。 我需要的是一种将路径前缀编码为整数并将其分配给每个CPU的方法,以便它知道应该扫描哪些路径。 例如,如果城市数为10,则一个可能的3前缀(假设前缀长度固定且已知)为4-10-3(有10*9*8个前缀),因此接收它的CPU将搜索以4-10-3开头的所有路径。 因为城市的数量很大,我无法计算n!因此,我不能使用上面的帖子。作为数字的排列的标准表示法使用。其思想是,n个元素的每个排列都可

我读过这篇文章,它非常接近我的问题,但不能概括它。 我试图通过使用多个CPU搜索所有路径来解决旅行销售人员的问题。 我需要的是一种将路径前缀编码为整数并将其分配给每个CPU的方法,以便它知道应该扫描哪些路径。 例如,如果城市数为10,则一个可能的3前缀(假设前缀长度固定且已知)为4-10-3(有10*9*8个前缀),因此接收它的CPU将搜索以4-10-3开头的所有路径。
因为城市的数量很大,我无法计算n!因此,我不能使用上面的帖子。

作为数字的排列的标准表示法使用。其思想是,n个元素的每个排列都可以映射到n个数字的序列,第一个数字在0到(n-1)范围内,第二个数字在0到(n-2)范围内,等等。然后,这个数字序列可以在阶乘数系统中表示为单个整数

我相信这一技巧应该可以应用于置换前缀,而不是整个置换。假设您有n个元素,并希望选择其中k个元素的排列。为此,首先计算部分置换的Lehmer码。不是得到一个n个数字的序列,而是得到一个k个数字的序列。例如,给定从
a b c d e f g
中提取的部分置换
c a d
,您的莱默码如下所示:

  • c
    a b c d e f g
  • a
    a b d e f g
  • d
    b d e f g
所以莱默密码应该是
(2,0,1)

一旦你有了这个莱默代码,你可以试着把它编码成一个整数。为此,可以使用修改的阶乘数系统编码。具体来说,您可以尝试执行以下操作。如果您有n个元素,并且想要k个元素的置换,那么最后一个元素总共有(n-k+1)个可能的选择。第二个到最后一个元素总共有(n-k+2)个可能的选择,(n-k+3)第三个到最后一个元素的可能选择,等等。因此,您可以使用Lehmer代码并执行以下操作:

  • 保持最后一位数字不变
  • 将倒数第二个元素乘以(n-k+1)
  • 将倒数第三个元素乘以(n-k+1)(n-k+2) 4
  • 将第一个元素乘以(n-k+1)(n-k+2)…(n-1)
  • 把这些值加起来
  • 这将为置换生成唯一的整数代码

    例如,我们的莱默代码是
    (2,0,1)
    ,n=7,k=3。因此,我们要计算

    1+0×(7-3+1)+2×(7-3+2)(7-3+3)

    =1+2×(5×6)

    =5+2×30

    =61

    要反转此过程,可以获取整数并通过此过程向后运行,以恢复部分Lehmer代码。要做到这一点,首先取数字除以(n-k+1)(n-k+2)…(n-1)得到莱默码的第一位数字。然后,用(n-k+1)(n-k+2)…(n-1)修改数字,以去掉第一个数字。然后,将数字除以(n-k+1)(n-k+2)…(n-2)以返回莱默码的第二位,然后用(n-k+1)(n-k+2)…(n-2)修改以删除第二位。重复此操作,直到重建了Lehmer代码的所有数字

    例如,给定前缀61,n=7,k=3,我们首先将61除以7×6=30。这等于2,余数为1。因此,莱默码的第一位数字是2。30分钟后,我们得到1号。接下来,我们除以6。这等于0,余数为1。因此,第二个数字是0。最后,我们读出剩余的数字,它给出了莱默码的最后一位数字1。我们已经恢复了Lehmer代码
    (2,0,1)
    ,从中我们可以很容易地重建置换


    希望这有帮助

    这里最简单的方法是映射前缀,而不将其视为置换的一部分。不要将前缀映射到[0,10*9*8-1],而是映射到[0,10*10*10-1],因此前缀0,4,5将映射到数字45,前缀4,1,9将映射到数字419(当然,假设总共有10个城市)。

    我想我理解您的意图。我不明白的是,您对其中的哪一部分有困难。@NPE假设城市数为10,前缀大小为3(固定)。所以有10*9*8个不同的前缀。我很难找到[1,10*9*8]范围内的数字与前缀之间的映射。这是一个比我的方法简单得多的解决方案。:-)我唯一担心的是,对于大集合的长前缀,这可能比更有效的映射更快地溢出整数。事实上,但我认为不会有很多情况下这种技术会溢出,而最有效的技术不会。也就是说,你或许可以挤进另一个城市,但我怀疑你能否挤进更多。如果您遇到这个问题,您必须以另一种方式解决它(不使用整数编码整个前缀)。这有点问题,因为它可能是不明确的。数字12可以解释为1-2或12,因此必须用-1来分隔它们。这将限制我可以支持的前缀的大小。它一点也不含糊。如果您有10个城市,且前缀包含3个城市,“12”仅表示“城市0、城市1、城市2”和。没有其他意义。问题是另一面——444不是合法的前缀,但这不是真正的问题,因为他是编码前缀的人。是的,谢谢!你写道:“那就有了