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


我给了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)。)

有任何想法吗 ?


5857
2018-02-27 00:39


起源

你能解释一下N号码是如何形成的吗?如果N在哪里{1,2,3,4},答案是什么? - Peter Alexander
从我所看到的,你给出的N个数字与你提出的问题无关。它是否正确? - sykora
N是有多少个数,在这种情况下N = 4,因为有四个数字,1..4。 - VaioIsBorn
你的蛮力解决方案在什么意义上不起作用?它只是太慢还是崩溃,还是......? - MatrixFrog
如果强制执行不起作用,则代码错误。 - Michael Mullany


答案:


就像一个提示。

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

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

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


9
2018-02-27 00:44



作为完整拓扑排序之前的一个步骤,您至少可以创建有序片段以简化强制执行。例如,如果优先规则是:3,4 4,5 5,8您知道您可以使用优先规则不受约束的整数的前置,插入和追加来置换[3458](这当然概括为上述) - Michael Mullany


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


4
2018-02-27 00:49



实际上他可以检查规则,同时创建排列。这会大大缩短时间,他最终会得到一个结果。 - Kugel
我同意。如果N = 8是你需要能够处理的最高值,那么你可能不值得花时间为这样的东西提供比蛮力更好的东西。 - Justin Peel
是的,对于暴力解决方案肯定会有很多简单的优化,但他提到他甚至都存在问题。 - Tanzelax


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

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

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


1
2018-02-27 01:14



@serial_downvoter:取消了你。哈哈! - Billy ONeal