查找与一组规则匹配的所有排列

时间:2010-02-27 00:39:48

标签: c++ algorithm brute-force

我给了N个号码,并且他们对他们的订单适用M规则。规则以一对索引表示,每对(A,B)告诉索引A(第A个数字)的数字必须在第B个数字之后 - 它不必在他旁边

Ex: N = 4
    1 2 3 4
    M = 2
    3 2
    3 1

Output: 1234, 4213, 4123, 2134, 2143, 2413, 1423 ...Maybe there are even more:) 

该算法应该为我提供所有不会破坏规则的排列,例如示例 - 3必须始终在2之后和1之后。

我尝试过强制但它不起作用(虽然强力应该在这里工作,N在范围内(1,8)。)

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

就像一个提示。

您可以将您的规则集视为图表。每个索引都是一个顶点,每个规则都是一个有向边。

任何数字的正确排序(即满足规则的排列)对应于上图的所谓 topological ordering 。为了生成所有有效的数字排序,您需要生成该图的所有可能的拓扑排序。

P.S。在链接的维基百科页面上给出的第一个拓扑排序算法已经允许一个相当简单的解决方案,它将枚举所有有效的排列。实施需要一些努力和一些关心,但这不是火箭科学。

答案 1 :(得分:4)

暴力强制将是going through every permutation,这是O(N!),并且对于每个排列简单地循环遍历每个规则以确认它们是aplpy,即O(M)。这最终O(N!M)有点荒谬,但对于这么小的一套它不应该“不起作用”。

答案 2 :(得分:1)

老实说,最好的办法是回去让暴力解决方案正常工作。一旦完成(如果你还有时间等),你可以寻找更好的算法。

向下选民

编辑。学生(应该)试图按时完成作业。通过它的声音,他的家庭作业是一个编程练习,蛮力的解决方案就足够了。帮助他找出一个有效的算法并没有解决他的真实问题。

在这种情况下,他尝试过简单的蛮力方法(每个人都认为应该适用于小N值)并过早地放弃它来尝试可能更难的事情。任何有经验的开发人员都会告诉你这是一个坏主意。学生需要并且应该被告知,如果他是明智的,他会关注。但显然,这是他的选择......