比较两个等价类(续)

时间:2012-02-17 03:05:27

标签: graph ocaml

val compare : bool array array -> 'a list -> 'a list -> int

比较m生成列表上的词典顺序。我不知道如何填写???

let rec compare m c c' =
  match c with
    | [] -> (match c' with
            | [] -> 0
            | _ :: _ -> -1)
    | hd1 :: tl1 -> (match c' with
                    | [] -> 1
                    | hd2 :: tl2 -> ???

这是我试图在一个int列表中执行的功能。但是这个功能不满足,它仍然缺少检查列表的其余部分。

let cmp_classes m c c' =
   match c, c' with
    | i :: _, j :: _ ->
      begin
        match m.(i).(j), m.(j).(i) with
      (* same class: there is a path between i and j, and between j and i *)
          | true, true -> 0
      (* there is a path between i and j *)
          | true, false -> 1
      (* there is a path between j and i *)
          | false, true -> -1
      (* i and j are not compareable *)
          | false, false -> 0
      end
    | _ -> assert false
你能帮帮我吗?因为当我在int

中尝试使用此函数时
let cmp_classes m i j =
   match m.(i).(j), m.(j).(i) with
      (* same class: there is a path between i and j, and between j and i *)
          | true, true -> 0
      (* there is a path between i and j *)
          | true, false -> 1
      (* there is a path between j and i *)
          | false, true -> -1
      (* i and j are not compareable *)
          | false, false -> 0

它仍然没有在我测试的数据中返回正确的顺序。 我一直在做这个功能很多次,当我不得不一次又一次地尝试但却没有发现什么是错的时候它真的被卡住了。拜托我需要你的帮忙。谢谢

1 个答案:

答案 0 :(得分:3)

(* i and j are not compareable *)
      | false, false -> 0

如果你试图对你的元素进行拓扑排序,这是完全错误的。你说无比的元素是等于完全无意义的,并且会混淆排序算法。

如果您想拥有真正的拓扑订单,请按以下步骤操作:

  • 构建一个输入列表作为每个类只包含一个表示者的列表;输出列表为空
  • 直到输入列表为空:
    • 在输入列表中选择一个随机根(没有输入边)并将其从列表中删除
    • 追加(以任何顺序)输出列表中根代表的所有元素
  • 返回输出列表

根据您使用的数据结构,此算法的效率可能更高或更低,但您的问题不足以让我告诉您更多信息。