代码之家  ›  专栏  ›  技术社区  ›  Tara McGrew

使用不完整的比较函数对列表进行排序

  •  2
  • Tara McGrew  · 技术社区  · 16 年前

    我有一组对象,需要生成一个排序列表,但我的比较函数不完整,在排序算法方面留下了一些“想象”的空间。

    具体来说,给定一组树,如下所示:

      A      E
      |      |
      B--C   F
      |
      D
    

    我手头上有一组节点 {A, B, C, D, E, F} ,无特定顺序,以及用于测试直接父子关系的函数:

    parent(A, B)
    parent(A, C)
    parent(B, D)
    parent(E, F)
    

    我需要把这个列成一个单子,父母排在孩子前面,但除此之外,顺序并不重要。因此,这些结果中的任何一个都是可以接受的:

    A, B, C, D, E, F.
    
    A, B, D, C, E, F.
    
    E, F, A, B, C, D.
    
    A, E, B, C, F, D.
    

    布景会很小,最多几十个,所以我不太关心性能。我所关心的是避免使用列表以外的临时数据结构:由于我使用的语言的限制,将这些项组织到一个临时树(例如)中会令人不快。

    2 回复  |  直到 8 年前
        1
  •  4
  •   tangens    16 年前

    您可以使用以下简单算法:

    while unsorted set is not empty {
        elem = get element from unsorted set
        while elem has parent and parent is in unsorted set {
            elem = parent of elem
        }
        add elem to result list
        remove elem from unsorted set
    }
    
        2
  •  4
  •   Amnon    16 年前

    topological sort 算法。

    L ← Empty list that will contain the sorted nodes
    S ← Set of all nodes
    
    function visit(node n)
        if n has not been visited yet then
            mark n as visited
            for each node m with an edge from n to m do
                visit(m)
            add n to L
    
    for each node n in S do
        visit(n)