算术排序解决方案到脑筋急转弯/拼图

时间:2013-01-03 16:51:08

标签: java algorithm sorting

您之前可能已经看过订购脑筋急转弯:

  

在最新一轮的BrainBashers铁人三项赛中,基思是   第四。阿德里安不是最年长的,但比邓肯更老   不是第二个。接下来是最小的孩子,完成了   第二。排在第三位的孩子比孩子大   谁先完成了。比利比完成的孩子年轻   第三名。你能确定谁在哪里完成并放置了   孩子按年龄顺序? [Source]

我正在寻找一种算法来解决看似非常相似的问题。

我有一组对象,我想根据将对象相互关联的规则进行排序。对于给定的一组规则,可能存在多个解决方案。在有效的解决方案中,所有规则都得到满足。一组规则也可能没有有效的解决方案。

示例:

对象:A, B, C, D, E, and F

规则:

  • C> A
  • C< d
  • F< ç
  • A> ˚F
  • E> ˚F
  • D> ë

一种可能的解决方案:

 F A C E D B

请注意,对象B与任何其他对象无关,因此它在序列中出现的位置无关紧要。

以前这已经完成了。谁能指出我正确的方向?我最终将在Java中执行这种排序。

相关问题: Java partially ordered Collection<E>

3 个答案:

答案 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)

[编辑,更好的解释] 使用没有前任的对象,然后使用没有前驱的对象,但使用已经使用过的对象,依此类推。

您可以查看对象的所有前导,然后查看是否找到没有前任的对象并将其放在第一个位置。然后,您将查找没有其他前辈的对象,而不是已使用的对象。等等...