对于我的算法类,我们需要编写一个自下而上的最小变化算法。
作为示例输出,我们的教授为我们提供了
n=4
1234 2314 3124
1243 2341 3142
1423 2431 3412
4123 4231 4312
4132 4213 4321
1432 2413 3421
1342 2143 3241
1324 2134 3214
请注意,它会生成24个排列(每个数字6个)。 4的排列(如4中的排列中的第一个数字)是该算法中其他调用的副产品。您还可以看到每个开关位置最多只有2个数字。
我一直在努力在这些数字中找到一个好的模式来建立我的代码。 所以我在考虑对这个问题采取略微不同的方法。
如果我采用n
的阶乘,我可以计算排列的数量。通过将排列数除以n
,我得到每个数字在每个相应位置的次数(即,每个数字开始有多少个排列)。将后续结果除以n-1我得到每秒数字出现的次数,给定第一个数字保持不变。所以依此类推(每次减少一个n),直到所有数字都用完为止。
例如,假设n=4
4! = 24
24/4 = 6
6/3 = 2
2/2 = 1
使用这些结果,我可以垂直生成排列,而不是水平生成排列。
取而代之的是取一个数字并在其他数字上来回滑动并经常进行交换,而是生成一个维度为nxn!
的表格。然后,沿着列向下填充第一列,包括6个,6个,6个,6个,4个和5个。
当我到达第二列时,每个数字将被放入twp次,然后重复直到达到数组的末尾。随后,每列将遵循类似的模式。此模式适用于任何大小的n
输入。
我的输出是这样的:
n=4
1234 2134 3124 4123
1243 2143 3142 4132
1324 2314 3214 4213
1342 2341 3241 4231
1423 2413 3421 4312
1432 2431 3412 4321
现在我的问题是......这仍然被视为最小变化算法吗?
我的算法在字典顺序上工作得更多,这让我担心它可能不被认为是最小变化算法(因为在某些步骤中,多个数字似乎'交换',但实际上没有进行交换)。
答案 0 :(得分:1)
不,这不是最小变化算法 - 要求输出中的每对相邻排列相差一个交换。