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

最佳答案

置换的标准表示形式是数字,使用Lehmer codes中表示的factorial number system。其思想是,n个元素的每一个置换都可以映射成n个数的序列,其中第一个在0到(n-1)的范围内,第二个在0到(n-2)的范围内,等等。然后,这个数序列可以在阶乘数系中表示为单个整数。
我认为,应该可以调整这个技巧,使之与排列的前缀而不是整个排列一起工作。假设您有n个元素,并希望选择其中k个元素的置换为此,首先计算部分置换的lehmer代码。不是得到n个数字的序列,而是得到k个数字的序列例如,给定从c a d中提取的部分置换a b c d e f g,您的Lehmer代码如下所示:
ca b c d e f g的第二个(零索引)元素
aa b d e f g的第0个(零索引)元素
db d e f g的第一个(零索引)元素
所以lehmer代码应该是(2, 0, 1)
一旦你有了这个lehmer代码,你可以试着把它编码成一个整数。为此,可以使用修改的阶乘数系统编码具体来说,您可以尝试执行以下操作。如果你有n个元素并且想要k个元素的排列,那么最后一个元素就有(n-k+1)个可能的选择。第二个到最后一个元素总共有(n-k+2)个可能的选择,(n-k+3)第三个到最后一个元素的可能选择,等等。因此,您可以使用Lehmer代码并执行以下操作:
保持最后一个数字不变。
将第二个到最后一个元素乘以(n-k+1)。
将第三个到最后一个元素乘以(n-k+1)(n-k+2)
四。。。
将第一个元素乘以(n-k+1)(n-k+2)…(n-1)
把这些值加起来。
这将为置换生成唯一的整数代码。
例如,我们的Lehmer代码是(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)得到lehmer码的第一个数字。然后,将数字修改为(n-k+1)(n-k+2)…(n-1)以删除第一个数字然后,将数字除以(n-k+1)(n-k+2)…(n-2)以取回lehmer码的第二个数字,然后将mod除以(n-k+1)(n-k+2)…(n-2)以删除第二个数字。重复此操作,直到重建了lehmer码的所有数字。
例如,给定前缀61,n=7,k=3,我们首先将61除以7×6=30这是2,余数是1因此,lehmer码的第一个数字是2。在30点之前,我们把1号弄回来。接下来,我们除以6。这将得到0,余数为1因此第二个数字是0。最后,我们读出剩下的数字,它给出了Lehmer码的最后一个数字1我们已经恢复了lehmer码,从中我们可以很容易地重建排列。
希望这有帮助!

10-07 15:34