【问题标题】:Algorithmic sorting solution to brain teaser/puzzle脑筋急转弯/拼图的算法排序解决方案
【发布时间】:2013-01-03 16:51:08
【问题描述】:

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

在最新一轮的 BrainBashers 铁人三项赛中,Keith 是 第四。阿德里安不是最年长的,但比邓肯年长, 不是第二个。年龄比最小的那个孩子完成了 第二。获得第三名的孩子比孩子大 谁先完成。比利比完成学业的孩子还小 第三名。你能确定谁在哪里完成并放置 孩子按年龄排序? [Source]

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

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

示例:

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

规则:

  • C > A
  • C
  • F
  • A > F
  • E > F
  • D > E

一种可能的解决方案:

 F A C E D B

请注意,对象 B 与任何其他对象都不相关,因此它出现在序列中的哪个位置并不重要。

这肯定是以前做过的。谁能指出我正确的方向?我最终将在 Java 中执行这种排序。

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

【问题讨论】:

标签: java algorithm sorting


【解决方案1】:

一种选择是使用规则构建directed graph,然后执行topological sort

注意:我不知道这是否是最有效的方法,这只是我想到的第一件事。然而,这是 O(N),所以从渐近的角度来看,你不会做得更好!

【讨论】:

  • 这似乎是要走的路。但是...我打算让这个问题坐一会儿,看看会发生什么!
【解决方案2】:

效率不高,但一种简单的蛮力方式是

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]

【讨论】:

  • 这不是 O(N.N!) 平均情况吗?
  • 我喜欢它(尽管我不能让自己在我的应用程序中使用它)。
【解决方案3】:

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

您可以查看一个对象的所有前辈,然后查看是否找到没有前辈的对象并将其放在首位。然后,您寻找除了已经使用过的对象之外没有其他前任的对象。等等……

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 2011-02-14
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2014-08-03
    相关资源
    最近更新 更多