该算法是否会被视为最小变化算法?

时间:2011-12-06 02:02:02

标签: algorithm permutation

对于我的算法类,我们需要编写一个自下而上的最小变化算法。

作为示例输出,我们的教授为我们提供了

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

现在我的问题是......这仍然被视为最小变化算法吗?

我的算法在字典顺序上工作得更多,这让我担心它可能不被认为是最小变化算法(因为在某些步骤中,多个数字似乎'交换',但实际上没有进行交换)。

1 个答案:

答案 0 :(得分:1)

不,这不是最小变化算法 - 要求输出中的每对相邻排列相差一个交换。