【发布时间】:2012-08-19 00:34:18
【问题描述】:
给定一个类似的序列:
1,2,1,2,1,1,1,2,1,2,1,3,1,2,1,2,1,3
什么是获得最小排序的有效方法:
1,1,1,2,1,2,1,3,1,2,1,2,1,3,1,2,1,2
蛮力方法很明显,所以请不要推荐它 - 除非提供令人信服的证据证明蛮力方法是唯一的方法!
更多细节
我有一个生成数字列表的算法。该算法的输出是一个列表/数组,但从逻辑上讲,数字代表一个循环,其中只有元素的相对顺序很重要。为了存储这些循环以供以后比较,我想以这样一种方式存储它们,即存储的一维数字列表代表循环中元素的最小顺序。图片将是最有帮助的:
这个循环描述了 T tetromino 周围的路径,其中 1 是向前移动,2 是右转,3 是左转。不管你从哪里开始,甚至你往哪个方向走,按照这 18 个动作的顺序,你都会得到一个 T tetromino。产生此循环的算法的输出将返回具有任意起点和方向的元素。所以返回的数组可能是:
任意初始排序:
1,2,1,2,1,1,1,2,1,2,1,3,1,2,1,2,1,3
不过,有一个最低订购量。它可以从两个不同的电路中得到,反映了 T tetromino 是对称的:
最低订购量:
1,1,1,2,1,2,1,3,1,2,1,2,1,3,1,2,1,2
蛮力
显而易见的蛮力方法是构造所有可能的排序并取最小值。我的问题是是否有更聪明、更有效的方法来做到这一点。
【问题讨论】:
-
这是一个经过充分研究的问题:en.wikipedia.org/wiki/Lexicographically_minimal_string_rotation(只需应用两次,然后将其中的最小值也用于“向后”)
-
@harold 谢谢!我缺乏词汇或背景,甚至不知道如何搜索那个答案。将该链接发布为答案,我将其标记为答案。