【发布时间】:2012-01-13 17:37:21
【问题描述】:
对于我的算法类,我们需要编写一个自下而上的最小变化算法。
作为我们的教授提供给我们的示例输出
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 个 1、6 个 2、6 个 3、6 个 4 和 6 个 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
现在我的问题是……这仍然被认为是最小变化算法吗?
我的算法更按字典顺序工作,这让我担心它可能不被视为最小变化算法(因为在某些步骤中,多个数字似乎“交换”,但实际上没有进行交换)。
【问题讨论】:
-
我在project euler 问题中遇到了类似的情况。我必须使用factoradics 对排列进行正确排序。有了它,您可以随意安排它们。
-
你是说我可以使用我的技术,并重新排列我的输出以匹配他的吗?
-
不,这不是最小变化算法。
-
我唯一能找到的关于最小变化算法的是Permutations Wikipedia page 上的 Johnson-Trotter 算法。现在我知道我不是回答这个问题的合适人选,但我有点感兴趣。你能告诉我更多关于这种算法的信息吗?
-
你提到它很有趣,因为我还必须在 C# 中创建 Johnson-Trotter 算法。我得到的最好的信息来自 Anany Levitin 的一本名为“算法设计和分析简介”的书。这是一本大学水平的教科书。如果你足够努力,你会发现它真的很便宜(我花了 25 美元买了一个国际版)。老实说,那本书中的一些东西甚至似乎都没有出现在谷歌上,所以他们有一些真正专业的东西。就我个人而言,我发现算法很难且具有挑战性,但也很有趣!
标签: algorithm permutation