您之前可能已经看过订购脑筋急转弯:
在最新一轮的BrainBashers铁人三项赛中,基思是 第四。阿德里安不是最年长的,但比邓肯更老 不是第二个。接下来是最小的孩子,完成了 第二。排在第三位的孩子比孩子大 谁先完成了。比利比完成的孩子年轻 第三名。你能确定谁在哪里完成并放置了 孩子按年龄顺序? [Source]
我正在寻找一种算法来解决看似非常相似的问题。
我有一组对象,我想根据将对象相互关联的规则进行排序。对于给定的一组规则,可能存在多个解决方案。在有效的解决方案中,所有规则都得到满足。一组规则也可能没有有效的解决方案。
示例:
对象:A, B, C, D, E, and F
规则:
一种可能的解决方案:
F A C E D B
请注意,对象B与任何其他对象无关,因此它在序列中出现的位置无关紧要。
以前这已经完成了。谁能指出我正确的方向?我最终将在Java中执行这种排序。
答案 0 :(得分:6)
一种选择是使用规则构建directed graph,然后执行topological sort。
注意:我不知道这是否是最有效的方法,这只是我想到的第一件事。但是,这是 O(N),因此从渐近的观点来看,你不会做得更好!
答案 1 :(得分:3)
效率不高,但是简单的蛮力方式
List<String> names = Arrays.asList("A", "B", "C", "D", "E", "F");
do {
Collections.shuffle(names);
} while (!(
names.indexOf("C") < names.indexOf("A") &&
names.indexOf("C") > names.indexOf("D") &&
names.indexOf("F") > names.indexOf("C") &&
names.indexOf("A") < names.indexOf("F") &&
names.indexOf("E") < names.indexOf("F") &&
names.indexOf("D") < names.indexOf("E")));
System.out.println("A solution is " + names);
打印
A solution is [D, C, A, B, E, F]
答案 2 :(得分:1)
[编辑,更好的解释] 使用没有前任的对象,然后使用没有前驱的对象,但使用已经使用过的对象,依此类推。
您可以查看对象的所有前导,然后查看是否找到没有前任的对象并将其放在第一个位置。然后,您将查找没有其他前辈的对象,而不是已使用的对象。等等...